hibernate之实业对象生命周期

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;