Hibernate中的对象有三种状态:Transient(瞬时),Persistent(持久),Detached(脱管)状态.在持久层的对象也称为
PO(Persistence Object),瞬时对象和脱管对象称为VO(Value Object)。
1.瞬时状态
由new命令开辟内存空间的Java对象,如 Student stu=new Student("tom","18");如果没有变量对它进行引用,
它将被JVM回收。瞬时对象在内存中孤立存在,它的意义是携带信息的载体,不和数据库的数据有任何关联关系。通过Session的save()和saveOrUpdate()方法可以把一个瞬时对象与数据库想关联,并把瞬时对象携带的信息通过配置文件的所做的映射插入到数据库中,这个瞬时对象就转化为了持久化的对象,并拥有和数据库记录相同的id标识 (Hibernate自动将id值赋予它)。
2.持久化状态
持久的实例在数据库中有对应的记录,并拥有一个持久化的标识。无论它是刚被保存的,或刚加载的,无论哪一种,按定义对象都仅在相关联的Session生命周期内保持这种状态。如果直接进行数据查询所返回的数据对象,例如使用find(),get(),load(),iterator()等方法查询到的数据对象,则这些对象都与数据库中的字段相关,具有与数据库识别值相同的id值,他们也马上变成为持久对象。另外,如果一个瞬时对象被持久对象引用,那么该对象也会自动变成持久对象。
如果使用delete()方法。它就会变回瞬时对象,删除了数据库与这个对象关联的记录,对象与数据库不再有任何的关联。
持久对象总是与Session和Transaction相关联,在一个Session中,对持久对象的改变并不会马上对数据库进行变更而必须在Transaction终止,也即时执行commit()之后,才在数据库中真正SQL进行变更,持久对象才会与数据库进行同步。同步之前的对象称为脏(dirty)对象。当一个Session指定close()或clear(),evict()之后,持久对象就变成脱管对象,这时对象的id虽然拥有数据库识别值,但他们目前并不在Hibernate持久层的管理下,它与瞬时对象的本质是相同的,只不过比瞬时对象多了数据标识的id值。
3.脱管状态
与持久对象关联的Session被关闭之后对象就变为脱管的。对脱管对象的引用依然有效,对象可以继续被修改。脱
管对象如果重新被关联到某个新的Session上,会再次变成持久的(脱管状态期间的改动将被持久化到数据库上)。
脱管对象拥有数据库识别值id,所以它可以通过update(),saveOrUpdate(),lock()等方法,再度与持久层关联。
通常的应用是从数据库查询一笔数据后,关闭Session以将联机资源让出,此时的对象是脱管对象,使用着经过一段时间操作脱管对象(例如购物车),然后重新开启一个Session,将脱管对象与Session关联,然后将变更结果存回数据库。
Hibernate中Java对象的三种状态
最新推荐文章于 2019-03-29 10:23:14 发布