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 查看本文章