Hibernate3.2(三)Hibernate 对象的生命周期

Hibernate 持久化对象的生命周期(lifecycle):

1. transient Objects(瞬时对象)

    使用new操作符初始化的对象不是立即就持久的。他们的状态时瞬时的,也就是说它们没有任何跟数据库表相关联的

    行为。只要应用不再引用这些对象(不再被任何其他对象所引用),他们的状态就会丢失,并由垃圾回收机制回收。

2. Persistent Objects(持久对象):

    是任何就有数据库标识的实例。它由持久化管理器Session统一管理,持久化实例是在事务中操作的——它们的状态在

    事务结束时同数据库同步。当事务提交时,通过执行SQL的insert、update、delete语句把内存中的状态同步到数据

    库。

3. Detached Objects(离线对象):

    Session关闭之后,持久化对象就变为离线对象。离线对象表示这个对象不能再与数据库保持同步,他们不再

    受Hibernate管理。

 

注意:

 

瞬时对象和离线对象的主要区别是离线对象在数据库中有对应记录(有没有这条记录是看主键来判断的)。主要共同点是transient 对象和detached 对象都可以被垃圾回收机制回收,因为它们没有被session管理,瞬时对象和离线(又称脱管)对象也称为VO(Value Object)。
transient 执行了save()就变成了persistent状态,持久的对象执行了session.close() or clear() 等,就变成了离线状态,session没有管理它,可以被垃圾回收。因为数据库中还存在与离线对象对应的记录,所以可以执行update(),重新把detached 对象变为persistent对象,又放入了session的缓存中了,又被session管理了。

persistent对象在数据库中有对应记录,也纳入了session 的管理。当执行delete(),状态变成了transient ,数据库中已经没有与之对应的对象,也没被session管理,可以被垃圾回收。新new出来的对象也是transient的。

 

瞬时态由new命令开辟内存空间的java对象eg. Person person = new Person("xxx", "xx");如果没有变量对该对象进行引用,它将被java虚拟机回收。瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。
     持久态处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象, 因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有 数据库识别值,但它已不在HIbernate持久层的管理之下。

 

持久对象总是与 Session Transaction 相关联,在一个 Session 中,对持久对象的改变不会马上对数据库进行变更,而必须在 Transaction 终止,也就是执行 commit() 之后,才在数据库中真正运行 SQL 进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏 (dirty) 对象。

 

详细的配图说明:

http://fehly.iteye.com/blog/619825

http://www.iteye.com/topic/859826