Hibernate学习总结(4)——持久化对象的三种状态

hibernate中的持久化对象具有三种状态,分别是:瞬时状态、持久化状态、脱管状态。

1.瞬时状态(Transient):实体对象是通过Java中的new关键字开辟内存空间创建的Java对象,但是它并没有纳入Hibernate Session 的管理中(不处于 Session的缓存中),如果没有变量对它引用,它将被JVM的垃圾回收器回收。瞬时状态的对象在内存中是孤立存在的,它与数据库中的数据无任何关联(在数据库中没有对应的记录),仅仅是一个信息携带的载体。

    若一个瞬时状态对象被持久化状态对象引用,它也会自动变为持久化状态对象。

在使用代理主键的情况下 , OID (对象标识符) 通常为 null
不处于 Session 的缓存中
在数据库中没有对应的记录

2.持久化状态(Persistent):持久化状态对象存在与数据库中的数据关联,它总是与Session和Transaction(事务)关联在一起。当持久化状态对象发生改动时并不会立即执行数据库操作,只有当事务结束时,才会更新数据库,以便保证Hibernate的持久化对象和数据库操作的同步性。当持久化状态对象变为脱管状态对象时,它将不在Hibernate持久层的管理范围之内。

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


3.脱管状态(Detached):当持久化状态的对象的Session关闭之后,这个对象就从持久化状态的对象变为脱管状态的对象。脱管状态的对象仍然存在与数据库中的数据关联,只是它并不在Hibernate的Session管理范围之内。如果将脱管状态的对象重新关联某个新的Session上,它将变回持久化状态对象。

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

三种状态的转换


扫描二维码关注公众号,回复: 1669527 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_40995335/article/details/80464429