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对象。