Hibernate 中对象有三种状态 Transient(瞬时), Persistent(持久)和 Detached(托管)状态。
在持久层的对象称为 PO (Persistent Object),瞬时对象和托管对象称为VO(Value Object)
瞬时状态:
new一个对象,如果没有变量对其进行引用,它将被JVM回收;瞬时对象在内存中是孤立存在的,它的意义仅是携带信息的载体,和数据库没有任何关联。通过Session的save()和saveOrUpdate()方法可以把这个瞬时对象与数据库相关联,并把瞬时对象带的信息通过配置文件所做的映射插入到数据库中,这个瞬时对象就变成了持久化对象,并拥有和数据库记录相同的id标识(Hibernate自动将id值赋予它)。
持久化状态:
持久(Persistent)的实例在数据库中有所对应的记录,并拥有持久化标志(identifier)。直接进行数据库查询所返回的对象,如find(),get()和iterater()等方法查询到的数据对象,这些对象会马上变为持久对象。若一个对象被持久对象引用,也会变为持久对象。
用delete()方法,变回瞬时状态。
持久对象总是与Session,Transaction相关联。在Session中,对持久对象的改变不会马上对数据库进行更改,而必须在Transaction终止,也就是执行完commit()后,持久对象的状态才会与数据库进行同步,在同步之前的持久对象称为脏(dirty)对象。
当一个Session执行close()或clear(),evict()后,持久对象会变为托管对象。此时对象的id虽然拥有数据库识别值,但它并不在Hibernate持久层的管理之下,它与瞬时状态本质是相同的,只不过多了数据标识的id值,没有任何变量引用到托管对象时,JVM会适时回收。
托干状态:
与持久对象关联的Session关闭后,对象就变为托管的;托管对象如果重新关联到某个Session上,会再次转变为持久的。通常的应用:从数据库查询到一笔数据,关闭Session将联机资源让出,此时对象为托管状态,使用者经过一段时间操作托管对象(例如购物车),然后重新开启Session,托管对象与Session重新关联,将变更结果存回数据库。
Hibernate的数据检索策略
立即检索:配置文件的标识符:lazy=“false”
Hibernate在从数据库中取得字段值组装好一个对象后(eg:学生1),会立即再从数据库取数据组装成此对象所关联的班级(eg:班级1),如果这个关联对象还 有关联对象(eg:学生2),再组装此关联对象。
一对一关联和多对一关联适合立即检索
延迟检索:配置文件的标识符:lazy=“true(默认都为true)
等到需要用到时,才会去取被关联的对象。”