中科软的面试题:hibernate实体对象的三种状态

来源:互联网 发布:pdf合并软件绿色版 编辑:程序博客网 时间:2024/05/16 11:20

刚开始接触Hibernate的时候,只是简单的把它当做一个API工具,直到后来看到有关VO和PO的内容时,才意识到Hibernate不仅仅是一个O/R Mapping的API工具,它还是一个容器。它可以帮你管理实体对象的生命周期。   
  
 实体对象的生命周期有三种状态:   
 1.Transient(自由状态)   
 此时的实体对象和数据库中的记录无关联,只是一个普通的JavaBean。   
 2.Persistent(持久状态)   
 此时的实体对象和数据库中的记录有关联,其变更将由Hibernate固化到数据库中。该实体对象处于由Hibernate框架所管理的状态。   
 3.Detached(游离状态)   
 处于Persistent状态的对象,其对应的Session实例关闭之后,那么,此对象就处于"Detached"状态。Detached状态和Transient状态的区别在于Detached状态的对象可以再次与某个Session实例相关联而成为Persistent对象。   
  
 从实体对象是否被纳入Hibernate实体管理容器的角度,Transient和Detached状态的实体对象可以统称为VO(Value Object),而被管理的实体对象称为PO(Persistent Object)。两者的区别:   
 1.VO是相对独立的实体对象,处于非管理状态。   
 2.PO是Hibernate纳入其实体管理容器(Entity Map)的对象,它代表了与数据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反映到实际数据库中。   
 3.如果一个PO与其对应的Session实例分离,那么此时,它又会变成一个VO。  
     刚开始接触Hibernate的时候,只是简单的把它当做一个API工具,直到后来看到有关VO和PO的内容时,才意识到Hibernate不仅仅是一个O/R Mapping的API工具,它还是一个容器。它可以帮你管理实体对象的生命周期。

      实体对象的生命周期有三种状态:
      1.Transient(自由状态)
      此时的实体对象和数据库中的记录无关联,只是一个普通的JavaBean。
      2.Persistent(持久状态)
      此时的实体对象和数据库中的记录有关联,其变更将由Hibernate固化到数据库中。该实体对象处于由Hibernate框架所管理的状态。
      3.Detached(游离状态)
      处于Persistent状态的对象,其对应的Session实例关闭之后,那么,此对象就处于"Detached"状态。Detached状态和Transient状态的区别在于Detached状态的对象可以再次与某个Session实例相关联而成为Persistent对象。

      从实体对象是否被纳入Hibernate实体管理容器的角度,Transient和Detached状态的实体对象可以统称为VO(Value Object),而被管理的实体对象称为PO(Persistent Object)。两者的区别:
      1.VO是相对独立的实体对象,处于非管理状态。
      2.PO是Hibernate纳入其实体管理容器(Entity Map)的对象,它代表了与数据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反映到实际数据库中。
      3.如果一个PO与其对应的Session实例分离,那么此时,它又会变成一个VO。
        Hibernate的对象有3种状态,    分别为:

             瞬时态(Transient)、

             持久态(Persistent)、

             脱管态(Detached).

         处于持久态的对象也称为PO(PersistenceObject),瞬时对象和脱管对象也称为VO(ValueObject).  

 

瞬时态   
由new命令开辟内存空间的java对象,   
  
eg.Person person=new Person("xiaoxiao","女");   
如果没有变量对该对象进行引用,它将被java虚拟机回收.   
  
瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象.   
  
持久态   
处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识.如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联.   
  
当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下.   
  
持久对象具有如下特点:   
  
1.和session实例关联;   
  
2.在数据库中有与之关联的记录.   
  
脱管态   
当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象.当脱管对象被重新关联到session上时,并再次转变成持久对象.   
  
脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象.   
  
脱管对象具有如下特点:   
  
1.本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;   
  
2.比瞬时对象多了一个数据库记录标识值. 
发表


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wzwjr/archive/2009/03/18/4001943.aspx