`

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;

 

分享到:
评论

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    Hibernate的Session的javadoc

    而且关于实体对象的生命周期也有很多概念不清,分不清transient、persistent、detached的区别,只是知道PO、VO这样的通俗叫法。其实这些概念都很简单,Hibernate的javadoc写的都很清楚,只需看看就能明白。

    精通Hibernate:对象持久化技术第二版part3

    本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...

    Spring和Hibernate学习笔记

    第二课:测试实体对象的生命周期 第三课:hibernate基本映射 第四课:hibernate多对一关联映射 ...................... Spring: 第一课:构建Spring的环境并建立一个例子 第三课:spring Bean的作用域 第四课:...

    Hibernate_二级缓存总结

    查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束 查询缓存的配置和使用: 1. 启用查询缓存:在 hibernate .cfg.xml 中加入: ”hibernate .cache.use_query_cache”>true</property> 2. 在...

    Hibernate实战(第2版 中文高清版)

     9.1 持久化生命周期   9.1.1 对象状态   9.1.2 持久化上下文   9.2 对象同一性和等同性   9.2.1 引入对话   9.2.2 对象同一性的范围   9.2.3 脱管对象的同一性   9.2.4 扩展持久化上下文   9.3 ...

    hibernate学习笔记

    测试实体对象的生命周期(hibernate_session) 3 hibernate基本映射(hibernate_basemapping) 4 class实体类---表 4 标签id 5 主键生成器Generator 6 多对一, 一对一, 一对多, 多对多 7 hibernate多对一关联映射...

    Hibernate+中文文档

    21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. ...

    hibernate 教程

    生命周期和对象图(Lifecyles and object graphs) 9.9. 拦截器(Interceptors) 9.10. 元数据(Metadata) API 10. 事务和并行(Transactions And Concurrency) 10.1. 配置,会话和工厂(Configurations, ...

    hibernate3.2中文文档(chm格式)

    21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. ...

    HibernateAPI中文版.chm

    21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. ...

    最全Hibernate 参考文档

    1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 3.1. 可编程的配置方式 ...

    Hibernate中文详细学习文档

    21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. ...

    Hibernate 中文 html 帮助文档

    21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. 示例:...

    Hibernate教程

    1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2. 映射文件 2.2.3. ...

Global site tag (gtag.js) - Google Analytics