Hibernate中的实体物件可以分为四种状态:
Transient、 Persistent、Detached、
Removed。
当您直接使用new创建出物件,例如在之前的例子中, User类别所衍生出之物件,在还没有使用save()之前都是Transient物件,这些物件还没有与资料库发生任何的关系,不对应于资料库中的任一笔资料。
当物件与资料库中的资料有对应关系,并且与Session 实例有关联而Session 实例尚未关闭(close),则它是在Persistent状态,具体而言,如果您将Transient状态的物件使用Session的save()方法加以储存,或是使用Hibernate从资料库载入资料并封装为物件(例如使用get()、load()等查询物件的相关方法),则该物件为Persistent状态。
Persistent状态的物件对应于资料库中的一笔资料,物件的id值与资料的主键值相同,并且Session实例尚未失效,在这期间您对物件的任何状态变动,在Session实例关闭(close)或Transaction实例执行commit()之后,资料库中对应的资料也会跟着更新。
如果您将Session实例关闭(close),则Persistent状态的物件会成为Detached状态。
如果您使用Session的实例delete()方法删除资料,Persistent状态的物件由于失去了对应的资料,则它会成为Transient状态。
Detached状态的物件,其id与资料库的主键值对应,但脱离Session实例的管理,例如在使用load()方法查询到资料并封装为物件之后,将Session实例关闭,则物件由Persistent状态变为Detached状态,Detached状态的物件之任何属性变动,不会对资料库中的资料造成任何的影响。
Detached状态的物件可以使用update()方法使之与资料库中的对应资料再度发生关联,此时Detached状态的物件会变为 Persistent状态。
Detached物件,若不再被任何名称参考,则在适当的时候将被垃圾收集所回收。
如果您使用Session的实例delete()或remove()方法删除资料,Persistent状态的物件由于失去了对应的资料,则它会成为Removed状态,一个成为Removed状态的物件不应该被继续重用,您应该释放任何参考至它的名称,让该物件在适当的时候被垃圾回收。
简单的说,Transient与Detached状态的物件未受Hibernate持久层管理员管理,对这两个状态的物件作任何属性变动,不会对资料库中的资料有任何的影响,Detached状态物件可以读取数据库数据。而Persistent状态的物件受Hibernate持久层管理,对物件的属性变动,在Session实例关闭(close)或 Transaction实例执行commit()之后,资料库中对应的资料也会跟着更新。
Transient与Detached状态的物件是非管理状态,而Persistent状态的物件是管理状态,又称为Persistent Object,其与一个Persistence Context 关联。
在物件为Persistent时,如果物件的属性发生变化,并且尚未提交之前,物件所携带的资料称之为Dirty Data,Hibernate会在Persistence Context维护物件的最近读取版本,并在资料提交时检查两个版本的属性是否有变化,如果有的话,则将资料库中的资料进行更新。