对象在Hibernate中有三种状态:Transient(瞬时状态),persistent(持久化状态),Detached(游离),三个状态反映的是当前对象与数据库之间的联系。三个状态质检可以相互转化。
1、瞬时状态:
瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。
2、持久化状态:
持久的实例在数据库中有对应的记录,拥有一个持久化标识。持久对象总是与Session和Transaction相关联,在一个Session中,对持久对象的改变不会马上对数据库进行变更,而必须在Transaction终止,也就是执行commit()之后,才在数据库中真正运行SQL进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象成为脏(dirty)对象。
使用find(),get(),load()和iterater()等方法查询到得数据对象,都是持久化对象;如果一个瞬时对象被持久对象引用,则该对象也会自动变为持久对象。
如果使用delete()方法,它就会变为瞬时对象;当一个Session执行close()或clear()、evict()之后,持久对象就会变为托管对象。
持久对象的特点:
(1)和Session实例关联
(2)在数据库中有和持久对象关联的记录
3、游离状态(脱管状态):
当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。
脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。
脱管对象具有如下特点:
1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
2. 比瞬时对象多了一个数据库记录标识值。