http://blog.csdn.net/yerenyuan_pku/article/details/52760627

在Hibernate中java对象的状态

Hibernate把对象分为4种状态:

  • 临时状态
  • 持久化状态
  • 游离状态
  • 删除状态

Session的特定方法能使对象从一个状态转换到另一个状态。

临时对象(transient)

  • 在使用代理主键的情况下,OID通常为null。
  • 不处于Session的缓存中。 
    Session里面是有一个集合的,这个集合我们称为Session的缓存,叫做一级缓存,它会引用Session要管理的对象。
  • 在数据库中没有对应的记录。

在以下情况下,Java对象进入临时状态。

  • 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。

持久化对象(也叫”托管”)(Persist)

  • OID不为null。
  • 位于Session缓存中。
  • 持久化对象和数据库中的相关记录对应。
  • Session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。
  • 在同一个Session实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象。

Session的许多方法都能够触发Java对象进入持久化状态:

  • Session的save()方法把临时对象转变为持久化对象。
  • Session的load()或get()方法返回的对象总是处于持久化状态。
  • Session的update()、saveOrUpdate()和lock()方法使游离对象转变为持久化对象。
  • 当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时会把这个临时对象也转变为持久化对象。

游离对象(也叫”脱管”)(Detached)

  • OID不为null。
  • 不再处于Session的缓存中。
  • 一般情况下,游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录。
  • 修改此状态对象时数据库不会有变化。

Session的以下方法使持久化对象转变为游离对象:

  • 当调用Session的close()方法时,Session的缓存被清空,缓存中的所有持久化对象都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,它们就会结束生命周期。
  • Session的evict()方法能够从缓存中删除一个持久化对象,使它变为游离状态。当Session的缓存中保留了大量的持久化对象,会消耗许多内存空间,为了提高性能,可以考虑调用evict()方法,从缓存中删除一些持久化对象。

删除对象(Removed)

  • OID不为null。
  • 从一个Session实例的缓存中删除。
  • 执行了delete()后的对象。
  • Session已经计划将其从数据库删除,Session在清理缓存时,会执行SQL delete语句,删除数据库中的对应记录。
  • 一般情况下,应用程序不该再使用被删除的对象。

对象的状态转换说明

对象的状态转换图: 

对象的状态总结

状态 Session缓存存在对应的记录 数据库中存在对应的记录
临时状态 no no
持久化状态 yes 可能有也可能没,如:Customer c=new Customer(); session.save(c); // 持久对象,但数据库中没有
游离状态 no 可能有(数据没有删除)也可能没有

最新文章

  1. SQL Server Reporting Service(SSRS) 第四篇 SSRS 用法总结
  2. (转)如何在一台电脑上开启多个tomcat 和配置让系统识别哪个具体的tomcat
  3. Facebook或成云领域黑马 冲击亚马逊
  4. COJ 删除数字
  5. stasm+三角剖分
  6. iPhone 6/iPhone 6 Plus硬件性能
  7. 《Python 学习手册4th》 第九章 元组、文件及其他
  8. CocoaPods的使用详解
  9. to disable the entity lazy load, The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
  10. hdu 1827
  11. C/C++ Resources
  12. iOS之UITableView的上拉刷新
  13. Akka(4): Routers - 智能任务分配
  14. spring +springmvc+mybatis组合总结
  15. 基于Windows环境下Myeclipse10.0下载安装破解及jdk的下载安装及环境变量的配置
  16. #if 与 #ifdef 之间的区别
  17. ELK 环境搭建3-Logstash
  18. jQuery中的事件与驱动
  19. C#基础篇十小练习
  20. AVR单片机命名规则

热门文章

  1. 如何将PSD批量装换为JPG如何对PSD批量减小体积
  2. hdu 5078 2014鞍山现场赛 水题
  3. 进销存管理系统, 刚学C++
  4. ios11--UIButton
  5. Linux gadget驱动分析3------复合设备驱动
  6. bzoj3332: 旧试题
  7. YTU 2723: 默认参数--求圆的面积
  8. B1277 [HNOI2002]Tinux系统 树形dp
  9. 洛谷 P3377 模板左偏树
  10. C++11系列-什么是C++11