首页 > 代码库 > Hibernate持久化对象的三种状态

Hibernate持久化对象的三种状态

          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()方法后,用户的名称由张三变成李四。

 

        如同例子,瞬时对象通过savesaveOrUpdate等方法成为持久态;此外对象通过Sessionget()或者是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()方法时,数据库中的数据才会同步更新。