实体对象的三种状态

上传人:桔**** 文档编号:547565075 上传时间:2023-07-09 格式:DOCX 页数:10 大小:43.15KB
返回 下载 相关 举报
实体对象的三种状态_第1页
第1页 / 共10页
实体对象的三种状态_第2页
第2页 / 共10页
实体对象的三种状态_第3页
第3页 / 共10页
实体对象的三种状态_第4页
第4页 / 共10页
实体对象的三种状态_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《实体对象的三种状态》由会员分享,可在线阅读,更多相关《实体对象的三种状态(10页珍藏版)》请在金锄头文库上搜索。

1、Hibernate 中实体对象的生命周期-对象状态分类的详细说明2011-04-19 19:27:33| 分类:以前 | 标签:session 对象 hibernate 状 态处于 丨字号订阅hibernate 中 java 对象的状态1.临时状态-transient特征: 1.1。不处于 Session 缓存中 1.2。数据库中没有对象记录java 如何进入临时状态 1。3通过 new 语句刚创建一个对象时14当调用Session胡delete()方法时,从Session缓存中删除一个对象时。 2持久化状态 -persisted特征:11。处于 Session 缓存中12。持久化对象数据库中

2、设有对象记录13。 Session 在特定时刻会保持二者同步java 如何进入持久化状态1.5。Session的save()反临时持久化状态1.6。Session的load()或get ()方法返回的对象1.7。Session的find()返回的list集合中存放的对象1.8。Session 的 update()或 saveOrUpdate()使游离持久化3游离状态-detached特征:3.1。不再位于 Session 缓存中3.2。游离对象由持久化状态转变而来,数据库中可能 还有对应记录 java 如何进入持久化状态-游离状态3.3。Session 的 close()方法3.4。Sessi

3、on的evict()方法,从缓存中删除一个对象。提高性能。少用。htt p: tech .ddvip com/2009-06/1244085545122377html1临时状态或瞬时态(transient):刚刚用new语句建立,还没有被持久化,不 处于session缓存中。处于临时状态的java对象称之为临时对象。由 new 命令开辟内存空间的 java 对象所谓的 transient 状态,即实体对象在内存中微幅存在,与数据库中的记录无关,通过是我们的J2EE中V0,并没有被纳入hibernate的实体管理窗口中.eg:Test test=new Test();test.setName(e

4、nergykk);此时 的 test 对象处于 Transient 状态, 并没有被 hibernate 框架所管理如果没有变量对该对象进行引用,它将被java虚拟回收瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联 关系,在Hibernate中,可通过session的save ()或saveOrUpdate()方法将瞬 时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成 持久化对象。2. 持久化对象(persistent):已经被持久化,加入到session的缓存中。处于持 久化状态的java对象被称之为持久化对象。会被session自动同步。即实体

5、对象已经处于被 hibernate 实体管理容器所管理的状态,这种状态下这个 实体对象的引用将被纳入 hibernate 实体管理容器所管理.处于 persistent 状态的实体对象,对它 的变更也将被固化到数据库中在 J2EE 中通常指的是一个 PO简单理解为:如果一个实体对象与session发生了关联,并且处于session的有效期内,那么这 个实体对象就处于 persistent 状态.eg:Transaction tr=session.beginTransaction();session.save(test);/此时的test对象已经处于Persistent (持久状态)它被 hib

6、ernate 纳入实体管理容器mit();Transaction tr2=session.beginTransaction();test.setName(xukai);/在这个事务中我们并没有显示的调用save()方法但是由于persistent状态的 对象将会自动的固化到时数据库中,因此此时正处在persistent状态的test对 象的变化也将自动补充同步到数据库中mit();处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是 用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中 的对应数据已被删除,该对象不再与数据库的记录并联。当一个s

7、ession执行close()或clear(),evic t()之后,持久对象变成脱管对象, 此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在 hibernate 持久层的管理之下。持久对象具有如下特点:1:和session实例并联;2:在数据库中有与之并联的记录。3托管(游离状态)(detached):持久化对象关联的session关闭后处于托管状 态,可以继续修改然后关联到新的session上,再次成为持久化对象,托管期 间的修改会被持久化到DB。这使长时间操作成为可能。eg:session.close();/与test对象关联的session被关闭,因此此时的tes

8、t对象进入detached(游 离状态)session2=HiberSessionFactory.getSession();Transaction tr3=Session2.beginTransaction();session2.update(test);/此时正处于det ached状态的test对象由于再次借助与session2被纳入到 hibernate的实体管理容器,所以此时的test对象恢复到persistent状态test.setName(jjj:);mit();session2.close();当与某持久对象并联的session被关闭后,该持久对象转变为脱管对象。当脱管 对象被重

9、新并联到session上时,并再次转变成持久对象脱管对象拥有数据库的识别值,可通过update(),savaOrUpdate(0等方法,转变 成持久对象。脱管对象具有如下特点:1:本质上与瞬时对象相同,在没有任何变量引用它时, JVM 会在适当的时 候将它回收2:比瞬时对象多了一个数据库记录标识值。rlansicntPct 肘 entSessicm. cEoseQ下国促菽画也宴体対集生环周価Jtt转拉国:Session up城)Session ddetBOSesst&n.save)区别:hibernate 三种状态中游离对象和临时对象异同:两者都 不会被 session 关联,对象属性和数据库

10、可能不一致游离对象由持久化对象关闭 session 而转化 而来,在内存中还有对象,所以此时 就变成游离状态了.hibernate 和 sql 的关系:在操作了 hibernate的方法如save ()等后,并没有直接生成sql语句,去操作数 据库,而是把这些更新存入session中,只有session缓存要被更新时,底层的 sql 语句才能执行, 数据存入数据库:举例:一:Session.save(user)运行机理.1. 把User对象加入缓存中,使它变成持久化对象.2. 选用映射文件指定的标识生成ID.3. 在Session清理缓存时候执行:在底层生成一个insert sql语句,把对象

11、存入 数据库.注意:在你执行Session.save(user)后,在Session清理缓存前,如果你修改user 对象属性值,那么最终存入数据库的值将是最后修改的值:此过程中ID不能被 修改.二:Session.dele te(user)运行过程.如果user是持久化对象,则执行删除操作,同样底层数据库的执行条件是:在 Session清理缓存时候:如果 user 是游离对象:1. 将user对象和Session关联,使之成为持久化对象2. 然后按照user是持久化对象的过程执行.处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为 VO(Value O

12、bject).hibernate 的各种保存方式的区别 (save,persist,update,saveOrUpdate,merge,flush,lock )及对象的三种状态hibernate 的保存hibernate 对于对象的保存提供了太多方法,他们之间有很多不同,这里细说一 下,以便区别。一。预备知识对于 hibernate, 它的对象有三种状态,transient,persistent,detached下边是常见的翻译办法:transien t:瞬态或者自由态 (new DeptPo(1,行政部,20,行政相关),该po的实例和session没有关联, 该 po 的实例处于 tran

13、sientPersis ten t:持久化状态(和数据库中记录想影射的po实例,它的状态是persistent,通过get和load 等得到的对象都 是 persistentdetached: 脱管状态或者游离态1: 当通过 get 或 load 方法得到的 po 对象它们都 处于 persistent, 但如 果执行dele te(po)时(但不能执行事务),该po状态就处于det ached,(表示 和session脱离关 联),因delete而变成游离态可以通过save或saveOrUpdate() 变成持久态2:当把session关闭时,session缓存中的persistent的po

14、对象也变成 detached因关闭session而变成游离态的可以通过lock,save,update变成持久态持久态实例可以通过调用dele te()变成脱管状态。通过get()或load()方法得到的实例都 是持久化状态的。脱管状态的实例可以通过调用lock()或者replicate()进行持久化。save()和 persist()将会引发 SQL 的 insert,delete()会引发 sqldelete,而update(0或merge()会引发sqlupdate.对持久化(persistent)实例的修改在 刷新提交时会被 检测到,它也会引起 sqlupdatesaveOrUpdat

15、e()或者 replicate()会弓丨发 sqlinsert 或者 Update二: save 和 update 区别把这一对放在第一位的原因是困为这一对是最常用 的。save 的作用是把一个新的对象保存update 是把一个脱管状态 的对象或自由态对象(一定要和一个记录对应)更新 到数据库中-.*.update 和 saveOrUpdate 区别这个是比较刀理解的,顾名思义,saveOrUpdate基本上就是合成了 save和update, 而 update 只是 update;引用 hibernate reference 中的一段话来解释他们的使用场合和区别通常下面的场景会使用update ()或saveOrUpdfate();程序在第一个 session 中加载对象,接着把 session 关闭 该对象被传递到表现层对象发生了一些改动该 对象被返回到业务逻辑层,最终到持久层程序创建第二session调用第二个session的update()方法持久这些

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号