Hibernate 实体对象的生命周期汇总

本帖汇总了网上几篇关于hibernate的生命周期的帖子。

转载:

实体对象的生命周期在Hibernate应用中是一个很关键的概念,正确的理解实体对象的生命周期将对我们应用Hibernate做持久层设计起到很大的作用.而所谓的实体对象的生命周期就是指实体对象由产生到被GC回收的一段过程.在这过程中我们需要理解的就是实体对象生命周期中的三种状态.

1. 自由状态(Transient)
所谓的Transient状态,即实体对象在内存中自由存在,与数据库中的记录无关,通常是我们的J2EE中 VO,并没有被纳入Hibernate的实体管理容器.

1    Test test = new Test();
2        test.setName("energykk");
3        //此时的test对象处于Transient(自由状态)并没有被Hibernate框架所管理
4        

2.持久状态(Persistent)
何谓 Persistent? 即实体对象已经处于被Hibernate实体管理容器容器所管理的状态.这种状态下这个实体对象的引用将被纳入Hibernate实体管理容器容器所管理.
处于Persistent状态的实体对象,对它的变更也将被固化到数据库中.
在J2EE中通常指的是一个PO.
Transaction tr = session.beginTransaction();
        session.save(test);
        
//此时的test对象已经处于Persistent(持久状态)它被Hibernate 纳入实体管理容器
        tr.commit();
        Transaction tr2 
= session.beginTransaction();
        test.setName(
"xukai");
        
//在这个事务中我们并没有显示的调用save()方法但是由于Persistent状态的对象将会自动的固化到
        
//数据库中,因此此时正处在Persistent状态的test对象的变化也将自动被同步到数据库中
        tr2.commit();

处于Persistent状态的实体可以简单的理解为:如果一个实体对象与session发生了关联,并且处于session的有效期内,那么这个实体对象就处于Persistent状态.

3.游离状态(Detached)
处于Persistent状态的实体对象,其对应的session关闭以后,那么这个实体就处于 Detached状态.
我们可以认为session对象就是一个Persistent的宿主,一旦这个宿主失效,那么这个实体就处于 Detached状态.

session.close();
        
//与test对象关联的session被关闭,因此此时的test对象进入 Detached(游离状态)
        
        session2 
= HibernateSessionFactory.getSession();
        Transaction tr3 
= session2.beginTransaction();
        session2.update(test);
        
//此时正处于Detached状态的test对象由于再次借助与session2被纳入到Hibernate的实体管理容器所以此时的
        
//test对象恢复到Persistent状态
        test.setName("jjjj");
        tr3.commit();
        
        session2.close();

既然Transient状态的实体与Detached状态的实体都与Hibernate的实体管理容器没有关系,那他们到底存在哪些差异?
差异就在于处于Transient状态的只有一个Name的属性.此时的test对象所包含的数据信息仅限于此,他与数据库中的记录没有任何瓜葛.
但是处于Detached状态的实体已经不止包含Name这个属性,还被赋予了主键也就是通常POJO里的id属性,由于id是主键,他可以确定数据库表中的一条
唯一的记录,那么自然的处于Detached状态的实体就能与数据库表中拥有相同id的记录相关联.
这就是他们之间所存在的差异, 简而言之,Transient状态的实体缺乏与数据库表记录之间的联系,而Detached状态的试题恰恰相反.只不过是脱离了session这个数据库操作平台而已.
原帖地址 : http://www.blogjava.net/energykk/archive/2007/05/08/115927.html

 生命周期图:
原图地址:http://hi.baidu.com/quest2run/blog/item/39e1d08c7dbd45f4503d9222.html
 

persistence context



生命周期特征总结 :
原帖地址 : http://blog.csdn.net/hgd250/archive/2008/08/06/2775943.aspx
Transient:

    与数据库中的记录没有任何关系,即没有与其相关联的数据库记录.
    与session没有任何关系.即没有通过session对象的实例对其进行任何持久化的操作
Persistent:
    每个persistent状态的实体对象都与一个session对象的实例相关联
    处于 Persistent状态的实体对象是与数据库中的记录相关联的.
    Hibernate会依据persistent状态的实体对象的属性变化而改变数据库中相对应的记录
.
Detached:
    游离态是由持久态实体对象转变而来的.
    游离态实体不再与session对象相关联.
    游离态实体对象与数据库中的记录没有直接联系,对其所做的任何修改将不会影响到到数据库中的数据.
    游离态实体对象在数据库有相对应的数据记录,如果没有被其他事务删除.

posted on 2011-02-14 14:26 AK47 阅读(328) 评论(0)  编辑  收藏 所属分类: Hibernate


只有注册用户登录后才能发表评论。


网站导航:
 
<2011年2月>
303112345
6789101112
13141516171819
20212223242526
272812345
6789101112

导航

统计

常用链接

留言簿

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜