hibernate之实体对象生命周期
在Hibernate的应用中,实体对象的生命周期,是一个关键的概念,这里的实体对象指的是Hibernate O/R映射关系中的域对象(即O/R中的“O”);
实体对象的三种状态:
- 自由状态(Transient)
所谓的Transient,即实体对象在内存中的自由存在,它与数据库无关;如:
TUser user = new TUser();; user.setName("keith "); user.setAge(new Integer(18)); user.setInfo("the stu No is:");
此时的user对象,只是在内存中存在,并没有和数据库想关联;
- 持久状态(Persistent)
所谓的Persistent,即实体对象在hibernate管理的状态下,在这种状态下,实体对象的引用被纳入hibernate实体容器中加以管理;处于Persistent状态的对象,会由hibernate固化到数据库中;如:
session.save(user); session.getTransaction().commit();
当session调用save()时,已经将user这个对象纳入hibernate的管理,当session获取transaction并提交时,就将这个对象固化到了数据库中;
当我们需要将某一条数据调出时,可以这样:
session.load(TUser.class, new Integer(1)); session.getTransaction().commit();
当session.load()时(也就是一个实体对象由Hibernate加载),那么此时它也是处于persistent状态;简单的说:如果一个实体对象与某个session实例发生了关联,并处于这个session的有效期内,那么它就处于persistent状态;
- 游离状态(Detached)
当一个对象处于某个session的实例范围之外,那么这个对象就处于游离状态!(处于persistent状态下的对象,其对应的session实例关闭之后,那么此对象就处于Detached状态);如:
session.close(); //此时的对象已经处于游离(Detached)状态
也可以这么看,Session实例是Persistent状态下对象的宿主,宿主消失了,其对象就没有什么可依靠的了,就成为游离状态(Detached);
那么,Detached状态和Persistent状态有什么区别呢?
区别在于处于Detached状态下的对象可以再找一个宿主(与某个session实例对象想关联,而成为persistent对象),也就会再次变成Persistent状态,而处于Persistent状态下的对象,如果其宿主还在,那么它就没有必要再重新去找一个新的宿主;
一个对象会由Transient--->Persisent--->Detached;那么这个过程中处于Detached状态的user和处于Transient状态的user有什么变化?既然一个Detached对象与hibernate容器无关了,那么两者之间还有什么差异?
再回顾下代码:
//创建了Transisent状态的user对象 TUser user = new TUser(); user.setName("keith "); user.setAge(new Integer(18)); user.setInfo("the stu No is"); //借助save()方法,将其转变为persisent状态 session.save(user);
关键在于,在session.save()方法执行过程中,User对象的内容已经发生了改变,当user对象处于Transisent状态下时,我们为它设定了一些属性,此时这个user对象所包含的数据信息也仅限于此,它于数据库中的记录没有任何对应关系;而当执行save()方法之后,Hibernate对user对象进行了持久化,并为其赋予了其相应的值,这个时候user对象自然就与数据库中的记录相对应了!
这就是前后两个状态user对象之间的基本差异:Transisent状态的user对象与数据中的数据缺乏对应关系,而Detached状态的对象,与库表中存在想对应的记录,但是Detached对象脱离了session这个数据管理平台,其状态的变化无法更新到数据库中;
VO与PO:
为了方便,将处于Transisent状态和Detached状态下的对象称为值对象,即VO(Value Object);将处于Persisent状态的对象称为持久对象,即PO(Persisent Object);这是站在“实体对象是否被纳入hibernate管理容器”的立场上区分,非管理的实体对象成为VO,被管理的对象成为PO;
VO与PO的区别:
1,VO是相对独立的对象,处于非管理状态;
2,PO是hibernate纳入其管理容器的对象,代表与数据库中某条记录的hibernate实体,PO的变化是在事务提交时将反映到实际数据库中;
3,如果一个PO与其对应的session实例分离,那么此时就会变成一个VO;