`

hibernate对象的三种状态及之间的转换 .

 
阅读更多
Hibernate的对象有3种状态,分别为:瞬时态(Transient)、持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。
瞬时态
        由new命令开辟内存空间的java对象,
       eg. Person person = new Person("xxx", "xx");
        如果没有变量对该对象进行引用,它将被java虚拟机回收。
         瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。


持久态
        处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。
       当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。
       持久对象具有如下特点:
        1. 和session实例关联;
       2. 在数据库中有与之关联的记录。


detached :脱管状态或者游离态
    (1) 当通过get 或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该po状态就处于 detached, (表示和session脱离关联),因delete而变成游离态可以通过save或saveOrUpdate()变成持久态
(2)当把session关闭时,session缓存中的persistent的po对象也变成detached
因关闭session而变成游离态的可以通过lock、save、update变成持久态
持久态 实例可以通过调用 delete()变成脱管状态 。
通过get()或load()方法得到的实例都是持久化状态的。
脱管状态的实例可以通过调用lock()或者replicate()进行持久化。

       脱管对象具有如下特点:
       1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
        2.   比瞬时对象多了一个数据库记录标识值。


游离态的特征:游离态的实体对象一定是由持久化实体对象转变来的。游离态的实体对象不再与Session相关联。游离态的实体对象与数据库中的数据没有直接联系。主要表现在对其的修改将不再影响数据库中的数据。游离态实体对象在数据库中有相应的数据记录(如果该记录没有被删除)

代码举例:

//创建一个瞬态对象

User user = new User();
user.setName("username");
user.setPassword("test");
//user仍然是一个瞬态对象

Session Session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//此时user仍然是瞬态对象
session.save(user);
//此时,user对象已经被纳入到Hibernate的实体管理容器中,并转变为Persistent状态

tx.commit();
//事务被提交后,向数据库的用户中插入一条记录
session.close();
//此时user对象变为了Detached状态。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics