06Hibernate实体类生命周期
1.Hibernate的Session缓存
- 减少访问数据库的频率,当Session的get()方法试图从数据库中加载一个对象时,Session先判断缓存中是否存在这个对象,如果存在就不需要再从数据库中检索,而直接从缓存中获取这个对象。
- 当缓存中的持久化对象之间存在循环关系是,Session会保证不会出现访问对象图的死循环,以及由循环引起的JVM堆栈溢出异常。
- Session能保证数据库中的相关记录与缓存中相应的对象保持同步。Session在清理缓存的时候会自动进行脏检查,如果发现Session缓存中的对象与数据库中的相应的记录不一致,就会根据对象的最新属性去同步更新数据库。
- 按照应用程序调用session.save()方法的先后顺序,执行所有对实体类进行插入的insert语句。
- 执行所有对实体类进行更新的update语句。
- 执行所有对实体类集合进行删除的delete语句。
- 执行所有对实体类集合进行删除、更新或者插入的SQL语句。
- 执行所有对实体类集合进行插入的insert语句。
- 按照应用程序调用session.delete()方法的先后顺序,执行所有对实体类进行删除的delete语句。
- 当应用程序调用org.hibernate.Transaction的commit()方法时,commit()方法先清理缓存,再提交事务。
- 当应用程序调用Hibernate执行查询时,如果缓存中的对象与数据库中的不一致(即缓存中的对象已发生变化),Hibernate就会先清理缓存再执行查询,以保证查询得到正确的数据。
- 当应用程序显式调用Session的flush()方法时。
2.实体类在Hibernate容器中的状态
- 临时状态(transient):刚用new语句创建,还未被持久化的并且不在Session的缓存中的实体类。
- 持久化状态(persistent):已被持久化,并且在Session缓存中的实体类。
- 删除状态(removed):不在Session缓存中,而且Session已计划将其从数据库中删除的实体类。
- 游离状态(detached):已被持久化,但不再处于Session的缓存中的实体类。
- 在使用代理主键的情况下,OID为null。
- 不在Session缓存中。
- 在数据库中没有对应的记录。
- OID不为null。
- 在Session缓存中
- 数据库中有对应的记录。
- OID不为null。
- 不在Session缓存中。
- Session计划将其从数据库中删除。
- Session在清理缓存时,会执行相应的delete语句。
- OID不为null。
- 不在Session缓存中。
- 数据库中有对应的记录。
3.Session接口的详细用法
4.Hibernate级联操作实体类
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。