在Hibernate中,持久化对象在被操作的过程中可以分为三个时期,这三个时期是和Session的周期相关的,因为Hibernate中的操作都是基于Session完成的。Session的特定方法能使对象从一个状态转换到另一个状态。
持久化对象的生命周期有三种,瞬时状态、持久状态和分离状态。如下图:
瞬时态
不曾进行持久化,未与任何Session相关联。此状态的对象是用new关键字创建出来的,此时对象没有和数据库中记录对应。
//Transient状态 Useruser = new User(); user.setName("张三"); user.setPassword("123"); user.setCreateTime(newDate()); user.setExpireTime(newDate());
持久态
持久化,当前与Session相关联。
//Persistent状态 session.save(user); user.setName("李四"); tx.commit();
通过Session对象的save()方法进行保存对象后,该对象变为持久态。也就是存在Session中了,并且在数据库中存在一条记录。但是数据只有在commit之后才会存到数据库中。在本示例中,调用了提交了commit()方法后,用户的名称由张三变成李四。
如同例子,瞬时对象通过save,saveOrUpdate等方法成为持久态;此外对象通过Session的get()或者是load()等方法直接成为持久态;游离态对象通过update,saveOrUpdate成为持久态。
持久化特征:
持久实例是任何具有数据库标识的实例。它具有持久化管理器Session统一管理,持久实例实在事务中进行操作的。
(1)位于一个Session实例的缓存中,也可以说,持久化对象总是被一个Session实例关联。
(2) 持久化对象和数据库中的相关记录对应。
(3)Session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。
游离态
之前进行持久化,但当前未与任何Session相关联。
//Persistent状态 session.save(user); user.setName("李四"); tx.commit(); //detached状态 user.setName("王五");
如上例子,脱离持久态之后,再想改变用户的名称已经不可能了,只有再回到持久态去更新用户的姓名才能把姓名更新到数据库中。所以游离态不能影响数据库中数据的变化。
游离态只能由持久态转换而来。
游离对象与瞬时对象:游离对象与瞬时对象的相似之处在于,都与Session没有关联,游离对象是由持久对象转换来的,所以数据库中可能有对应记录,瞬时对象在数据库中没有对应记录。
综上所述,发现处于瞬时态和游离态的对象不在Session管理中,无论怎样修改对象属性都不会影响数据库中的数据。而当对象处于持久态的时候,对对象的修改只有在执行commit()方法时,数据库中的数据才会同步更新。