Hibernate实体对象的三种状态

Hibernate实体对象的三种状态

       实体对象的生命周期,是Hibernate应用中的一个关键概念。实体对象生命周期的三种状态如下:

       1.Transient(自由状态)

           所谓Transient,即实体对象在内存中的自由存在,它与数据库中的记录无关。如:

public void methodA(){
            User user = new User();
            user.setName("Huangt");            

      }

        这里的user对象,与数据库中的记录没有任何关系。

       2.Persistent(持久状态)

           所谓Persistent,即实体对象处于由Hibernate框架所管理的状态。这种状态下,实体对象的引用被纳入Hibernate实体容器中加以管理。

Transaction tx = session.beginTransaction();
   session.save(user); 
   //此时user对象已经由Hibernate纳入实体管理容器,处于Persistent状态
   tx.commit();//事务提交之后,库表中已经插入一条用户 
    
   Transaction tx2= session.beginTransaction();
   user.setName("huang") ;//Persistent 
   anotherUser.setName("ronaldo") ; //Transient
   
   tx2.commit() ;
   /*
       虽然这个事务中我们没有显示调用session.save()保存对象
       但是由于处于Persistent状态的对象将自动被固化到数据库中,因此user对象
       的变化也将同步到数据库中,’Huangt‘用户记录已经被更新为‘huang’ 
       而对于Transient状态的anotherUser 来说,并没有改变 
    */

         可以看到,处于Transient状态的实体对象,可以通过session.save() 方法转换为Persistent状态。而同样,如果一个实体对象是由Hibernate加载(如通过session.load方法获得),那么,它也处于Persistent状态。Persistent对象对应了数据库中的一条记录,可以看作是数据库记录的对象化操作接口,其状态的变更将对数据库的记录产生影响。

          简而言之,如果一个实体对象与某个Session实例发生了关联,并处于对应Session有效期内,那么它就处于Persistent状态。

     3.Detached(游离状态)

        处于Persistent状态的对象,其对应的Session实例关闭之后,那么,此对象就处于“Detached”状态。

        Session实例可以看作是Persistent对象的宿主,一旦此宿主失效,那么其从属的Persistent对象即进入Detached状态。

Transaction tx = session.beginTransaction();
   session.save(user); 
   //此时user对象已经由Hibernate纳入实体管理容器,处于Persistent状态
   tx.commit();//事务提交之后,库表中已经插入一条用户 
  
   tx2.commit() ;
   
   session. close() ;
   //user对象此时状态为Detached,因为与其关联的session已经关闭

      那么,Detached状态与Transient状态有什么区别?

      区别就在于Detached对象可以再次与某个Session实例相关联而成Persistent对象。

相关推荐