(学习笔记)Hibernate的持久化周期
在持久化周期中,不同的ORM接口实现使用不同的术语,定义不同的状态和状态转变。同时,内部状态的使用不同于外部客户端应用。Hibernate只定义了三种状态,隐藏了复杂的内部实现(客户端代码中看不到).三种状态分别是:transient, persistent, detached.
?
一、transient objects
???? 1、 在Hibernate中,对象的初始化使用new 操作,但并没有立刻保存入数据库(persistent),他们的状态是transient,一旦引用对象的“指针”丢失,他们的状态也就丢失了——被垃圾回收了(这个就是他们的生命长度)。
???? 2、Hibernate认为所有的transient状态的实例都是非事务的。修改此状态的实例不会在任何事务中进行。也就是说对于此状态对象的改变,Hibernate并没有提供回滚功能。
???? 3、对象一旦被transient状态的对象引用,默认的此对象也是transient,即状态具有传递性。
二、persisten objects
???? 1、持久化对象是具有数据库的关键key的是那种被session.save()方法后的对象。他和数据库管理系统关联在一起。此状态对象具有传递性,他总是与一个session相关联,总是处于事务中。
???? 2、持久化对象在完成事务之后,他的状态应该和数据库中的状态保持一致。当一个事务提交的时候(INSERT, UPDATE, DELETE),在缓存中的状态应该传播到数据库中(也就是状态保持一致)。状态的传播也可能发生在其他时刻,比如,在执行语句的时候,Hibernate可能要与数据库同步。
???? 3、一个持久化对象的new操作,会跟数据库的primary key值相关联,但是他并没有被插入数据库中。这个new 持久化对象一致保存这“new”特性,直到发生同步(发生一些数据库操作)。当然,在事务结束时,我们不需要人为的更新缓存中的每一个persistent对象所对应的数据库row。ORM软件必须有一种检测工具:知道哪一个persisten对象在事务中被改变了。我们称这种举措为:"自动脏检查(automatic dirty chekcing:一个对象的改变没有立刻传递到数据库中,认为:dirty)",Hibernate尽可能迟的传递这种改变信息到数据库?Hibernate还能能够检测他的属性的改变,并尽可能只更新对应的字段。但是在某种环境下他是有害的,所以,默认情况下,Hibernate对所有的columns进行了更新,如果你想要支持update modified columns,你可以使用 dynamic-update='true'(在配置文件中定义)。
??? 4、一种persistent对象可以通过delete()方法的调用变成transient状态。
?
三、Detached objects
??? 1、当一个事务结束的时候,与持久化管理关联的persistent对象仍然存在,(一旦事务提交成功,缓存中的对象状态需要跟数据库保持一致)。
??? 2、当你close the Session,persistent对象将失去与持久化管理器关联。我们称这种对象所处的状态为detached。他意味着他们的状态不会再与数据库进行同步了。他们不在Hibernate管理中管理,但是他们仍然保存这persistent的数据信息,允许在事务的外头保留一个引用指向此对象。Hibernate允许你在一个新的事务中复用这些对象。从一个事务中返回对象到持久层并在新的一个事务中复用他们,这是Hibernate一个主要的卖点。