资源预览内容
第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
第9页 / 共10页
第10页 / 共10页
亲,该文档总共10页全部预览完了,如果喜欢就下载吧!
资源描述
HibernateHibernate 中实体对象的生命周期中实体对象的生命周期-对象状态分类的详细说明对象状态分类的详细说明 2011-04-19 19:27:33| 分类: 以前 | 标签:session 对象 hibernate状态 处于 |字号 订阅 hibernatehibernate 中中 javajava 对象的状态对象的状态1.1.临时状态临时状态-transient-transient特征:特征:1.11.1。不处于。不处于 SessionSession 缓存中缓存中1.21.2。数据库中没有对象记录。数据库中没有对象记录javajava 如何进入临时状态如何进入临时状态11。33通过通过 newnew 语句刚创建一个对象时语句刚创建一个对象时1.41.4当调用当调用 SessionSession 胡胡 delete()delete()方法时,从方法时,从 SessionSession 缓存中删除一个对象缓存中删除一个对象 时。时。22持久化状态持久化状态-persisted-persisted特征:特征:1.11.1。处于。处于 SessionSession 缓存中缓存中1.21.2。持久化对象数据库中设有对象记录。持久化对象数据库中设有对象记录1.31.3。SessionSession 在特定时刻会保持二者同步在特定时刻会保持二者同步javajava 如何进入持久化状态如何进入持久化状态1.51.5。SessionSession 的的 save()save()反临时反临时-持久化状态持久化状态1.61.6。SessionSession 的的 load()load()或或 get()get()方法返回的对象方法返回的对象1.71.7。SessionSession 的的 find()find()返回的返回的 listlist 集合中存放的对象集合中存放的对象1.81.8。SessionSession 的的 update()update()或或 saveOrUpdate()saveOrUpdate()使游离使游离-持久化持久化33游离状态游离状态-detached-detached特征:特征:3.13.1。不再位于。不再位于 SessionSession 缓存中缓存中3.23.2。游离对象由持久化状态转变而来,数据库中可能。游离对象由持久化状态转变而来,数据库中可能 还有对应记录还有对应记录javajava 如何进入持久化状态如何进入持久化状态-游离状态游离状态3.33.3。SessionSession 的的 close()close()方法方法3.43.4。SessionSession 的的 evict()evict()方法,从缓存中删除一个对象。提高性能。少用。方法,从缓存中删除一个对象。提高性能。少用。http:/tech.ddvip.com/2009-06/1244085545122377.htmlhttp:/tech.ddvip.com/2009-06/1244085545122377.html1.1.临时状态或瞬时态临时状态或瞬时态(transient):(transient):刚刚用刚刚用 newnew 语句建立,还没有被持久化,不语句建立,还没有被持久化,不 处于处于 sessionsession 缓存中。处于临时状态的缓存中。处于临时状态的 javajava 对象称之为临时对象。对象称之为临时对象。由 new 命令开辟内存空间的 java 对象所谓的 transient 状态,即实体对象在内存中微幅存在,与数据库中的记录无关, 通过是我们的 J2EE 中 VO,并没有被纳入 hibernate 的实体管理窗口中.eg:Test test=new Test();test.setName(“energykk“);此时 的 test 对象处于 Transient 状态,并没有被 hibernate 框架所管理如果没有变量对该对象进行引用,它将被 java 虚拟回收瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关 联关系,在 Hibernate 中,可通过 session 的 save()或 saveOrUpdate()方法将 瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转 变成持久化对象。2.2.持久化对象持久化对象(persistent):(persistent):已经被持久化,加入到已经被持久化,加入到 sessionsession 的缓存中。处于持的缓存中。处于持 久化状态的久化状态的 javajava 对象被称之为持久化对象。会被对象被称之为持久化对象。会被 sessionsession 自动同步。自动同步。即实体对象已经处于被 hibernate 实体管理容器所管理的状态,这种状态下这个 实体对象的引用将被纳入 hibernate 实体管理容器所管理.处于 persistent 状态的实体对象,对它 的变更也将被固化到数据库中在 J2EE 中通常指的是一个 PO简单理解为:如果一个实体对象与 session 发生了关联,并且处于 session 的有效期内,那么 这个实体对象就处于 persistent 状态.eg: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();处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果 是用 hibernate 的 delete()方法,对应的持久对象就变成瞬时对象,因数据库 中的对应数据已被删除,该对象不再与数据库的记录并联。当一个 session 执行 close()或 clear(),evict()之后,持久对象变成脱管对象, 此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不 在 hibernate 持久层的管理之下。持久对象具有如下特点:1:和 session 实例并联;2:在数据库中有与之并联的记录。3.3.托管(游离状态)托管(游离状态)(detached):(detached):持久化对象关联的持久化对象关联的 sessionsession 关闭后处于托管状关闭后处于托管状 态,可以继续修改然后关联到新的态,可以继续修改然后关联到新的 sessionsession 上,再次成为持久化对象,托管期上,再次成为持久化对象,托管期 间的修改会被持久化到间的修改会被持久化到 DBDB。这使长时间操作成为可能。这使长时间操作成为可能。eg:session.close();/与 test 对象关联的 session 被关闭,因此此时的 test 对象进入 detached(游 离状态)session2=HiberSessionFactory.getSession();Transaction tr3=Session2.beginTransaction();session2.update(test);/此时正处于 detached 状态的 test 对象由于再次借助与 session2 被纳入到 hibernate 的实体管理容器,所以此时的 test 对象恢复到 persistent 状态test.setName(“jjj:);tr3.commit();session2.close();当与某持久对象并联的 session 被关闭后,该持久对象转变为脱管对象。当脱 管对象被重新并联到 session 上时,并再次转变成持久对象脱管对象拥有数据库的识别值,可通过 update(),savaOrUpdate(0 等方法,转 变成持久对象。脱管对象具有如下特点:1:本质上与瞬时对象相同,在没有任何变量引用它时,JVM 会在适当的时 候将它回收2:比瞬时对象多了一个数据库记录标识值。区别区别: :hibernatehibernate 三种状态中游离对象和临时对象异同三种状态中游离对象和临时对象异同: :两者都 不会被 session 关联,对象属性和数据库可能不一致游离对象由持久化对象关闭 session 而转化 而来,在内存中还有对象,所以此时 就变成游离状态了.hibernatehibernate 和和 sqlsql 的关系的关系: :在操作了 hibernate 的方法如 save()等后,并没有直接生成 sql 语句,去操作数 据库,而是把这些更新存入 session 中,只有 session 缓存要被更新时,底层的 sql 语句才能执行,数据存入数据库:举例:一:Session.save(user)运行机理.1.把 User 对象加入缓存中,使它变成持久化对象.2.选用映射文件指定的标识生成 ID.3.在 Session 清理缓存时候执行:在底层生成一个 insert sql 语句,把对象存入 数据库.注意:在你执行 Session.save(user)后,在 Session 清理缓存前,如果你修改 user 对象属性值,那么最终存入数据库的值将是最后修改的值 :此过程中 ID 不 能被修改.二:Session.delete(user)运行过程.如果 user 是持久化对象,则执行删除操作,同样底层数据库的执行条件是:在 Session 清理缓存时候:如果 user 是游离对象:1.将 user 对象和 Session 关联,使之成为持久化对象2.然后按照 user 是持久化对象的过程执行.处于持久态的对象也称为 PO(Persistence Object),瞬时对象和脱管对象也称 为 VO(Value Object).hibernatehibernate 的各种保存方式的区别的各种保存方式的区别 (save,persist,update,saveOrUpdate,merge,flush,locksave,persist,update,saveOrUpdate,merge,flush,lock)及对象的三种状态)及对象的三种状态hibernatehibernate 的保存的保存hibernate 对于对象的保存提供了太多方法,他们之间有很多不同,这里细说 一下,以便区别。一。预备知识对于 hibernate,它的对象有三种状态,transient,persistent,detached下边是常见的翻译办法:transient:瞬态或者自由态(new DeptPo(1,“行政部“,20,“行政相关“),该 po 的实例和 session 没有关联, 该 po 的实例处于 transientPersistent:持久化状态(和数据库中记录想影射的 po 实例,它的状态是 persistent,通过 get 和 load 等得到的对象都 是 persistentdetached:脱管状态或者游离态1: 当通过 get 或 load 方法得到的 po 对象它们都 处于 persistent,但如 果执行 delete(po)时(但不能执行事务),该 po 状态就处于 detached,(表 示和 session 脱离关 联),因 delete 而
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号