分享

Hibernate持久化对象的三种状态

 X的世界 2013-08-30

Hibernate中持久化对象的状态有:TransientPersistentDetached


持久化对象的生命周期是:



怎样理解持久化对象的三种状态呢?下面的代码会体现出来

  1. package com.bjpowernode.hibernate;
  2. import java.util.Date;
  3. import junit.framework.TestCase;
  4. import org.hibernate.Session;
  5. import org.hibernate.Transaction;
  6. public class SessionTest extends TestCase {
  7. public void testSave1() {
  8. Session session = null;
  9. Transaction tx = null;
  10. try {
  11. session = HibernateUtils.getSession();
  12. tx = session.beginTransaction();
  13. //此时对象刚new出来,对象为Transient状态,在数据库中不存在
  14. User user = new User();
  15. user.setName("张三");
  16. user.setPassword("123");
  17. user.setCreateTime(new Date());
  18. user.setExpireTime(new Date());
  19. //Persistent状态
  20. //Persistent状态的对象,当对象的属性发生改变的时候
  21. //hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
  22. session.save(user);
  23. user.setName("李四");
  24. tx.commit();
  25. }catch(Exception e) {
  26. e.printStackTrace();
  27. if (tx != null) {
  28. tx.rollback();
  29. }
  30. }finally {
  31. HibernateUtils.closeSession(session);
  32. }
  33. //detached状态
  34. }
  35. public void testSave2() {
  36. Session session = null;
  37. Transaction tx = null;
  38. try {
  39. session = HibernateUtils.getSession();
  40. tx = session.beginTransaction();
  41. //Transient状态
  42. User user = new User();
  43. user.setName("张三");
  44. user.setPassword("123");
  45. user.setCreateTime(new Date());
  46. user.setExpireTime(new Date());
  47. //Persistent状态
  48. //Persistent状态的对象,当对象的属性发生改变的时候
  49. //hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
  50. session.save(user);
  51. user.setName("李四");
  52. //可以显示的调用update方法,因为此时为持久状态,调用update没有什么意义
  53. session.update(user);
  54. tx.commit();
  55. }catch(Exception e) {
  56. e.printStackTrace();
  57. if (tx != null) {
  58. tx.rollback();
  59. }
  60. }finally {
  61. HibernateUtils.closeSession(session);
  62. }
  63. //detached状态
  64. }
  65. public void testSave3() {
  66. Session session = null;
  67. Transaction tx = null;
  68. User user = null;
  69. try {
  70. session = HibernateUtils.getSession();
  71. tx = session.beginTransaction();
  72. //Transient状态
  73. user = new User();
  74. user.setName("张三");
  75. user.setPassword("123");
  76. user.setCreateTime(new Date());
  77. user.setExpireTime(new Date());
  78. //Persistent状态
  79. //Persistent状态的对象,当对象的属性发生改变的时候
  80. //hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
  81. session.save(user);
  82. user.setName("李四");
  83. tx.commit();
  84. }catch(Exception e) {
  85. e.printStackTrace();
  86. if (tx != null) {
  87. tx.rollback();
  88. }
  89. }finally {
  90. HibernateUtils.closeSession(session);
  91. }
  92. //detached状态,数据库中存在,但不被session管理
  93. user.setName("王五");
  94. try {
  95. session = HibernateUtils.getSession();
  96. session.beginTransaction();
  97. //通过session.update()方法将detached状态的对象重新纳入session管理
  98. //此时将变为persistent状态的对象
  99. //persistent状态的对象,在清理缓存是会和数据库同步
  100. session.update(user);
  101. session.getTransaction().commit();
  102. }catch(Exception e) {
  103. e.printStackTrace();
  104. session.getTransaction().rollback();
  105. }finally {
  106. HibernateUtils.closeSession(session);
  107. }
  108. }

Session对象的几种方法:

Get方法

特点:get加载上来的对象为持久对象执行get会马上发出查询语句get方法查询数据库中存在的数据;get方法查询数据库中不存在的数据,如果不存在返回nullget永远不支持lazy

Load方法

特点:与get方法相同的是加载出来的数据也是持久化的;不会马上发出查询语句,因为load支持lazy(延迟加载/懒加载),什么叫lazy?只有真正使用这个对象的时候,再创建,对于hibernate来说才真正的发出查询语句,主要是为了提高性能,lazy是hibernate中非常重要的特性hibernate的lazy是如何实现的?采用代理对象实现,代理对象主要采用的是CGLIB库生成的而不是JDK的动态代理,因为JDK的动态代理只能对实现了接口的类生成代理,CGLIB可以对类生成代理,它采用的是继承方式采用load查询不存在的数据hibernate会抛出ObjectNotFoundException异常load默认的是支持lazy

Update方法

特点:先加载再更新

Delete方法

特点:先加载再删除



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多