• 瞬时状态(Transient)

  通过new创建对象后,对象并没有立刻持久化,它并未与数据库中的数据有任何关联,此时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.三种状态之间的转换:

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

1 .瞬时状态转为持久状态

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

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

2. 持久状态转为瞬时状态

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

3. 持久状态转为游离状态

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

4 .游离状态转为持久状态

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

5. 游离状态转为瞬时状态

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

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

  1. package com.haidiyixiaoyu.demo;
  2.  
  3. import org.hibernate.Session;
  4. import org.junit.Test;
  5.  
  6. import com.haidiyixiaoyu.domain.User;
  7. import com.haidiyixiaoyu.utils.HibernateUtils;
  8. //对象的三种状态
  9. public class Demo1 {
  10. @Test
  11. //演示三种状态
  12. public void fun1(){
  13. Session session = HibernateUtils.openSession();
  14. session.beginTransaction();
  15. //------------------------------------------------
  16. User u = new User(); // 瞬时状态
  17. u.setName("tom"); // 瞬时状态
  18. u.setPassword("1234"); // 瞬时状态
  19.  
  20. session.save(u); // 持久状态
  21. //问题: 调用完save方法,数据库中有没有对应记录?
  22. // 没有对应记录, 但是最终会被同步到数据库中.仍然是持久状态.
  23. //------------------------------------------------
  24. session.getTransaction().commit(); // 持久状态
  25. session.close(); // 游离状态
  26. }
  27.  
  28. @Test
  29. //三种状态的转换
  30. // 瞬时 => 持久
  31. //瞬时:没有关联,没有id
  32. //持久: 有关联,有id
  33. public void fun2(){
  34. Session session = HibernateUtils.openSession();
  35. session.beginTransaction();
  36. //------------------------------------------------
  37. User u = new User(); // 瞬时状态
  38. u.setName("tom"); // 瞬时状态
  39. u.setPassword("1234"); // 瞬时状态
  40.  
  41. session.save(u); // 持久状态 save方法会使用主键生成策略,为User指定id. =>
  42. //主键自增 => 打印 insert语句
  43. //--------------------------// increment=> select max(id) ....
  44. //assigned => 需要手动指定主键,不指定将会报错
  45. session.getTransaction().commit(); // 持久状态
  46. //事务提交时,会把持久化状态对象同步到数据库中
  47. session.close(); // 游离状态
  48. }
  49.  
  50. // 瞬时=> 游离
  51. // 瞬时: 没有关联,没有id
  52. // 游离: 没有关联,有id(与数据库中对应的id)
  53. @Test
  54. public void fun3(){
  55. Session session = HibernateUtils.openSession();
  56. session.beginTransaction();
  57. //------------------------------------------------
  58. User u = new User(); // 瞬时状态
  59.  
  60. u.setId(1); //游离
  61.  
  62. //----------------------------------------------------
  63. session.getTransaction().commit(); // 持久状态
  64. //事务提交时,会把持久化状态对象同步到数据库中
  65. session.close(); // 游离状态
  66. }
  67. @Test
  68. // 持久=> 瞬时
  69. // 持久: 有关联,有id
  70. // 瞬时: 无关联,无id
  71. public void fun4(){
  72. Session session = HibernateUtils.openSession();
  73. session.beginTransaction();
  74. //------------------------------------------------
  75. //通过get方法,得到持久状态对象
  76. User u= (User) session.get(User.class, 1); // 持久状态
  77.  
  78. //----------------------------------------------------
  79. session.getTransaction().commit(); // 持久状态
  80. //事务提交时,会把持久化状态对象同步到数据库中
  81. session.close(); // 游离状态
  82. u.setId(null);//瞬时状态
  83. }
  84. @Test
  85. // 持久=> 瞬时
  86. // 持久: 有关联,有id
  87. // 瞬时: 无关联,无id
  88. public void fun5(){
  89. Session session = HibernateUtils.openSession();
  90. session.beginTransaction();
  91. //------------------------------------------------
  92. //通过get方法,得到持久状态对象
  93. User u= (User) session.get(User.class, 1); // 持久状态
  94.  
  95. session.evict(u);//将User对象与session的关联移除
  96.  
  97. u.setId(null);//瞬时状态
  98.  
  99. session.save(u);//持久状态
  100.  
  101. //----------------------------------------------------
  102. session.getTransaction().commit(); // 持久状态
  103. //事务提交时,会把持久化状态对象同步到数据库中
  104. session.close(); // 游离状态
  105. }
  106. // 持久=> 游离
  107. @Test
  108. // 持久=> 游离
  109. //持久:有关联,有id
  110. //游离:没有关联,有id(与数据库中对应的id)
  111. // 只需要将session的关联取消
  112. public void fun6(){
  113. Session session = HibernateUtils.openSession();
  114. session.beginTransaction();
  115. //------------------------------------------------
  116. //通过get方法,得到持久状态对象
  117. User u= (User) session.get(User.class, 1); // 持久状态
  118.  
  119. session.evict(u);//游离
  120.  
  121. //----------------------------------------------------
  122. session.getTransaction().commit(); // 游离状态
  123. session.close(); // 游离状态
  124. }
  125.  
  126. @Test
  127. // 游离=> 瞬时
  128. //游离:没有关联,有id(与数据库中对应的id)
  129. //瞬时:无关联,无id
  130. // 移除ID
  131. public void fun7(){
  132. Session session = HibernateUtils.openSession();
  133. session.beginTransaction();
  134. //------------------------------------------------
  135. //通过get方法,得到持久状态对象
  136. User u= (User) session.get(User.class, 1); // 持久状态
  137.  
  138. session.evict(u);//游离
  139.  
  140. u.setId(null);// 瞬时
  141.  
  142. //----------------------------------------------------
  143. session.getTransaction().commit(); // 瞬时状态
  144. session.close(); // 瞬时状态
  145. }
  146. @Test
  147. // 游离=> 持久
  148. //游离:没有关联,有id(与数据库中对应的id)
  149. //持久:有关联,有id
  150. // 是否与Session关联
  151. public void fun8(){
  152. Session session = HibernateUtils.openSession();
  153. session.beginTransaction();
  154. //------------------------------------------------
  155. //通过get方法,得到持久状态对象
  156. User u= (User) session.get(User.class, 1); // 持久状态
  157.  
  158. session.evict(u);//游离
  159.  
  160. session.update(u);//持久
  161. //----------------------------------------------------
  162. session.getTransaction().commit(); // 持久状态 -> 打印update语句
  163. session.close(); // 瞬时状态
  164. }
  165.  
  166. //三种状态有什么用?
  167. // 持久状态,我们使用Hibernate主要是为了持久化我们的数据.
  168. // 对于对象的状态,我们期望我们需要同步到数据库的数据,都被转换成持久状态
  169. //持久化状态特点: Hibernate会自动将持久化状态对象的变化同步到数据库中.
  170.  
  171. @Test
  172. public void fun9(){
  173. Session session = HibernateUtils.openSession();
  174. session.beginTransaction();
  175. //------------------------------------------------
  176. //通过get方法,得到持久状态对象
  177. User u= (User) session.get(User.class, 1); // 持久状态
  178.  
  179. u.setName("jerry");//持久状态
  180.  
  181. // u.setId(3);//与session建立关联的对象的ID,不允许修改.
  182.  
  183. session.update(u);// 多余=> 因为Hibernate会自动将持久化状态对象的变化同步到数据库中.
  184.  
  185. //----------------------------------------------------
  186. session.getTransaction().commit(); // 持久状态 -> 打印update语句
  187. session.close(); // 瞬时状态
  188. }
  189.  
  190. }

Hibernate实体对象的生命周期(三种状态)的更多相关文章

  1. DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明

    From http://blog.csdn.net/sunstone/article/details/5282666 DataSnap高级技术(7)—TDSServerClass中Lifecycle生 ...

  2. hibernate 持久化对象的生命周期 2.1

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...

  3. hibernate 持久化对象的生命周期

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...

  4. hibernate学习笔记之三 持久化的三种状态

    Hibernate持久化对象有3中状态,瞬时对象(transientObjects),持久化对象(persistentObjects),离线对象(detachedObjects) 下图显示持久化三种状 ...

  5. Delphi2010中DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明

    Lifecycle 三种属性: Session.Invocation.Server 这三种属性都用在什么情况,有什么要注意的事项,Delphi2010中罕有说明. 如果乱用这三种属性,你的服务程序有可 ...

  6. 菜鸟学SSH(八)——Hibernate对象的三种状态

    前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢.说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧.今天就先说说Hibernate对 ...

  7. hibernate 实体对象的三种状态以及转换关系。

    最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态,面试的时候基本上问的也是三种状态),分别是:瞬时态(new, or transient).持久态(managed, ...

  8. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  9. 【SSH系列】-- Hibernate持久化对象的三种状态

    在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...

随机推荐

  1. Activity启动场景Task分析(二)

    场景分析 下面通过启动Activity的代码来分析一下: 1.桌面 首先,我们看下处于桌面时的状态,运行命令: adb shell dumpsys activity 结果如下 ACTIVITY MAN ...

  2. LeetCode.953-验证外语字典顺序(Verifying an Alien Dictionary)

    这是悦乐书的第364次更新,第392篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第226题(顺位题号是953).在外语中,令人惊讶的是,他们也使用英文小写字母,但可能使 ...

  3. java锁机制的面试题

    java锁机制的面试题 1.ABA问题 2.CAS乐观锁 3.synchronize实现原理 4.synchronize与lock的区别 5.volatile实现原理 6.乐观锁的业务场景及实现方式 ...

  4. java 换包

    1.进入目录:cd /opt/cw_isc/ 2.查看:ls 3.查看进程:ps -ef|grep aw-sc-package-all.jar 4.杀死进程kill -9 3982 5.查看进程:ps ...

  5. sqlplus语句示例

    我们通常所说的DML.DDL.DCL语句都是sql*plus语句,它们执行完后,都可以保存在一个被称为sql buffer的内存区域中,并且只能保存一条最近执行的sql语句,我们可以对保存在sql b ...

  6. Springg MVC 中文乱码处理

    1.对于post请求的处理方式,在web.xml添加拦截器 <filter> <filter-name>CharacterEncodingFilter</filter-n ...

  7. python 写简单的职员信息管理系统

    职员信息管理系统要求依次从键盘录入每位员工的信息,包括姓名.员工id.身份证号要求:1.身份证号十八位,要求除了第18位可以为x,其余都只能为数字2.id须由5位数字组成3.否则提示用户重新输入不符合 ...

  8. ds replicas是什么

    以上是我百度的答案.很显然,这个对于初学者很不友好,中文的每一个靠谱的,英文的都TM是how 和 why .But 我要 what! 所以只能自己搞,自己琢磨,搞完分享出来,助力后来者不掉坑,有所查. ...

  9. RabbitMQ入门教程(八):远程过程调用RPC

    原文:RabbitMQ入门教程(八):远程过程调用RPC 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.cs ...

  10. jackson json序列化 首字母大写 第二个字母需小写

    有这样一个类: @Setter @Getter @JsonNaming(value = PropertyNamingStrategy.UpperCamelCaseStrategy.class) pub ...