博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate 系列 07 - Hibernate中Java对象的三种状态
阅读量:6976 次
发布时间:2019-06-27

本文共 2549 字,大约阅读时间需要 8 分钟。

 

引导目录:

  

 

 

1. Java对象的三种状态

  当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期。

  持久化声明周期是Hibernate中的一个关键概念,正确地理解生命周期,可以更好地了解Hibernate的实现原理,掌握Hibernate的正确用法。

  Hibernate框架通过Session来管理Java对象的状态,在持久化生命周期中,Java对象存在着如下三种状态:

 

  • 瞬时状态(Transient)

  通过new创建对象后,对象并没有like持久化,它并未与数据库中的数据有任何关联,此时Java对象的状态为瞬时状态。

  Session对于瞬时状态的Java对象是一无所知的,当对象不再被其他对象引用时,它的所有数据也就丢失了,对象将会被Java虚拟机按照垃圾回收机制处理。

  • 持久状态(Persistent)

  当对象与Session关联,被Session管理时,它就处于持久状态。处于持久状态的对象拥有数据库标识(数据库中的主键值)。

  那么,对象是什么时候与Session发生关联的呢?有两种方法:

    第一种,通过Sesison的查询接口,或者get()方法,或者load()方法从数据库中加载对象的时候,加载的对象是与数据库表中的一条记录关联的,此时对象与加载它的Session发生关联;

    第二种,瞬时状态的对象,通过Session的save()方法或SaveOrUpdate()方法时,Java对象也与Session发生关联。

  对于处于持久状态的对象,Session会持续跟踪和管理它们,如果对象的内部状态发生了任何变更,Hibernate会选择合适的时机(如事务提交时)将变更固化到数据库中。

  • 游离状态

  处于持久状态的对象,脱离与其关联的nSession的管理后,对象就处于游离状态。

  处于游离状态的对象,Session无法保证对象所包含的数据与数据库中的记录一直,因为Hibernate已经无法感知对该对象的任何操作。

  Session提供了两个方法(update()、merge()),将处于游离状态的对象,与一个新的Session发生关联。

  此时,对象的状态就从游离状态重新转换为持久状态。

 

 

 

 

 

2. 三种状态之间的转换

  在Hibernate应用中,不同的持久化操作会导致对象状态的改变。如图描述了对象状态的转换:

 

  使用new关键字构建对象,该对象的状态是瞬时状态。

2.1 瞬时状态转为持久状态

  使用Session对象的save()或saveOrUpdate()方法保存对象后,该对象的状态由瞬时状态转换为持久状态。

  使用Session对象的get()或load()方法获取对象,该对象的状态是持久状态。

2.2 持久状态转为瞬时状态

  执行Session对象的delete()方法后,对象由原来的持久状态变为瞬时状态,因为此时该对象没有与任何的数据库数据关联。

2.3 持久状态转为游离状态

  吃行了Session对象的evict()、clear()或close()方法,对象由原来的持久状态转为游离状态。

2.4 游离状态转为持久状态

  重新获取Session对象,执行Session对象的update()或saveOrUpdate()方法,对象由游离状态转为持久状态,该对象再次与Session对象相关联。

2.5 游离状态转为瞬时状态

  执行Session对象的delete()方法,对象由游离状态转为瞬时状态。

  处于瞬时状态或游离状态的对象不再被其他对象引用时,会被Java虚拟机按照垃圾回收机制处理。

 

 

 

 

3. 练习(好记性不如烂键盘) - 输出对象的状态

  需求:为以下两段代码补充语句,输出各个阶段对象的状态。

  代码1:

1 try{ 2     // 省略部分代码... 3     session = sessionFactory.openSession(); 4     tx = session.beginTransaction();    // 开始一个事务 5     User user = (User)session.load(User.class, new Integer("1001"));    // 获取用户对象 6     user.setUsername("张董");    // 修改用户信息 7     tx.commit();    // 提交事务 8 }catch(HibernateException e){ 9     e.printStackTrace();10     tx.rollback();    // 回滚事务11 }finally{12     if(null != session){13         session.close();    // 关闭session14     }15 }

  代码2:

1 try{ 2     // 省略部分代码 3     session = sessionFactory.openSession();    // 打开session 4     tx = session.beginTransaction();    // 开始一个事务 5     User user = (User)session.load(User.class, new Integer("1000"));    // 获取User对象 6     session.delete(user);    // 持久化操作 - 删除 7     tx.commit();    // 提交事务 8 }catch(HibernateException e){ 9     e.printStackTrace();10     tx.rollback();    // 回滚事务11 }finally{12     if(null != session){13         session.close();    // 关闭session14     }15 }

 

转载地址:http://htupl.baihongyu.com/

你可能感兴趣的文章
Java中正则Matcher类的matches()、lookAt()和find()的区别
查看>>
PHP获取毫秒时间戳,利用microtime()函数
查看>>
【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误
查看>>
C++ 纯虚方法
查看>>
.net内存回收与Dispose﹐Close﹐Finalize方法
查看>>
oracle update批量修改sql语句编写
查看>>
Web前端开发人员和设计师必读文章推荐【系列七】
查看>>
我的四轴专用PID参数整定方法及原理---超长文慎入(转)
查看>>
Python-常用字符串转换实例
查看>>
大数据高效复制的处理案例分析总结
查看>>
PagedGeometry 笔记03
查看>>
IAR生产HEX文件
查看>>
WCF笔记
查看>>
MOS2010开发基础和集几种开发模型
查看>>
配置导出MOSS2010列表数据到Excel并根据列表记录自动刷新数据
查看>>
Sharepoint学习笔记—ECMAScript对象模型系列-- 8、组与用户操作(一)
查看>>
SQuirreL SQL Client 使用记录
查看>>
HTML Inspector – 帮助你编写高质量的 HTML 代码
查看>>
vb.net结构化异常处理和“邪用”
查看>>
HEVC/H.265 的未来必须是使用并行处理(OpenCL?) OpenCV和OpenCL区别
查看>>