Hibernate持久化对象状态和session缓存_第1页
Hibernate持久化对象状态和session缓存_第2页
Hibernate持久化对象状态和session缓存_第3页
Hibernate持久化对象状态和session缓存_第4页
Hibernate持久化对象状态和session缓存_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Hibernate中持久化对象的三种状态Session缓存Hibernate以持久化对象(PO)为基础,通过操作PO对象,进一步操作与PO对象关联的数据库表记录Hibernate编程,持久化对象主要存在三种状态 瞬时状态瞬时状态(transient state) 持久状态持久状态(persistent state) 脱管状态脱管状态(detached state)当程序中通过new操作符实例化一个PO对象,而这个对象还没有被Session对象操作,也就是没有和一个Session对象关联时,则称这个PO对象为瞬时瞬时状态对象状态对象瞬时状态对象的特点: 没有与数据库表中的记录没有对应的映射关系S

2、tudent stu = new Student();stu.setNumber(“1001”);./省略其它属性设置Configuration cf = new Configuration(); cf.configure();SessionFactory sf = cf.buildSessionFactory();Session session = sf.openSession();session.beginTransaction();session.save(stu);session.getTmit();session.close();stu对象此时为“瞬时状态瞬时状态对象”如果一个PO对

3、象与与一个一个Session对象对象相关联相关联,比如被Session对象保存的、加载的、更新的,则称这个PO对象为持久状态对象持久状态对象 “与Session对象相关联”: 意思是:被Hibernate Session对象所接管,处在Session对象工作单元之内Student stu = new Student();stu.setNumber(“1001”);./省略其它属性设置Configuration cf = new Configuration(); cf.configure();SessionFactory sf = cf.buildSessionFactory();Session

4、 session = sf.openSession();session.beginTransaction();session.save(stu);session.getTmit();session.close();stu对象此时为“持久状态持久状态对象”Student stu = new Student();stu.setId(1);stu.setNumber(“1001”);./省略其它属性设置Configuration cf = new Configuration(); cf.configure();SessionFactory sf = cf.buildSessionFactory();

5、Session session = sf.openSession();session.beginTransaction();session.update(stu);session.getTmit();session.close();stu对象此时为“持久状态持久状态对象”Configuration cf = new Configuration(); cf.configure();SessionFactory sf = cf.buildSessionFactory();Session session = sf.openSession();session.beginTransaction();St

6、udent stu = (Student) session.get (Student.class,1);session.getTmit();session.close();stu对象此时为“持久状态持久状态对象”持久状态对象的特点: 与数据库表中的一条记录有对应的映射关系 与Session相关联,位于Session对象缓存之中 持久状态对象有改变,事务提交之后, Hibernate会自动检测到其变化,并将变化反映到数据库之中当与持久状态对象关联的Session关闭后,该对象就变成脱管状态对象脱管状态对象Configuration cf = new Configuration(); cf.con

7、figure();SessionFactory sf = cf.buildSessionFactory();Session session = sf.openSession();session.beginTransaction();Student stu = (Student) session.get (Student.class,1);session.getTmit();session.close();/在session关闭后,使用stu对象stu.setName(“tom2”);stu对象此时为“脱管状态对象”“脱管脱管”含义提示含义提示“脱管”的含义:脱离了Session对象的管辖范围!

8、脱管状态对象的特点: 与数据库表中的一条记录有对应的映射关系 没有与Session相关联,不位于Session对象缓存中当脱管状态对象再次与某个Session关联(即被某个Session接管)后,又会转变转变为持久状态对象省略获取session对象操作步骤session.beginTransaction();Student stu = (Student) session.get (Student.class,1);session.getTmit();session.close();/在session关闭后,使用stu对象stu.setName(“tom2”);/省略获取Session对象(名字

9、session2)操作步骤session2.beginTransaction();session2.update(stu);session2.getTmit();stu对象此时为“脱管状态对象”stu对象此时又成为“持久状态对象”Hibernate持久化对象状态转变示例: 示例数据文件:data1 示例StudentTest测试类中的testAddAndUpdate方法Hibernate_ObjectState通过本小节,进一步理解Hibernate中的Session对象及工作原理Session的作用: Hibernate中的Session对象是用来进行数据操作的一个基本工作单元,通过Sess

10、ion对象对PO对象进行增、删、改、查等操作,进而执行对应数据表的相应操作Session缓存: Hibernate Session对象维护着内存中的一块“缓存缓存”空间,里面存放着持久状态对象持久状态对象“减少数据库访问频率减少数据库访问频率”: 查询时,首先查看缓存中是否存在,存在直接引用,不存在再查询数据库1 1Session缓存空间缓存空间session.get(Student.class,1)OID为为1的的Student对象引用对象引用数据库OID为1的Student对象Hibernate将其放入当前Session对象的缓存从数据库读取加载一个OID为1的Student对象sessi

11、on.get(Student.class,1)下次查询时,先从缓存找是否存在OID为1的Student对象,有直接引用,没有再查数据库stuSession缓存示例 示例数据文件:data1 示例中StudentTest测试类的testGetStudent2()方法 实验前提:数据表中有对应记录可以读取加载Hibernate_SessionCache“自动检查脏数据自动检查脏数据”(automatic dirty checking) Hibernate从数据库中加载对象时,会在Session缓存里为该对象复制一份原始快照快照(snapshot) 当Session清理缓存清理缓存时,会将对象当前状

12、态与原始快照进行对比,并将对比后的变动同步写回到数据库 默认下,当事务提交时,Hibernate会清理Session缓存,使缓存中对象状态与数据库保持一致2 2Session缓存空间缓存空间session.get(Student.class,1)Hibernate将其放入当前Session对象的缓存,并复制一份快照OID为为1的的Student对象引用对象引用数据库OID为1的Student对象从数据库读取加载一个OID为1的Student对象stu.setName(“tom1”)session.getTmit();事务提交,Session清理缓存,对比对象快照与当前属性状态,发现变动,自动更

13、新至数据库,不需人为updatestuid: 1name : tomSession缓存示例 示例中StudentTest测试类的testUpdateStudent2Hibernate_SessionCache持久状态对象持久状态对象: 与数据库表中的一条记录有对应的映射关系 与Session相关联,位于位于SessionSession对象缓存之中对象缓存之中脱管状态对象脱管状态对象: 与数据库表中的一条记录有对应的映射关系 没有与Session相关联,不位于不位于SessionSession对象缓存中对象缓存中持久状态对象有改变,事务提交后, Hibernate自动检测到其变化,并将变化反映到

14、数据库之中,脱管状态对象则不具备该特点 示例(testUpdateStudent3方法)Hibernate_SessionCache“尽量延迟尽量延迟写入数据库的时间点,减少SQL语句的提交次数”Hibernate提交SQL语句的时机 当Session清理缓存清理缓存时 其它一些特定情况,主要包括 通过get方法加载,或者通过HQL语言查询时 当主键生成方式为数据库自增,调用save方法时3 3当Session对象清理缓存时,Hibernate发送SQL语句 清理缓存:默认,事务提交时,会清理缓存 示例(testUpdateStudent4方法)掌握程序设置断点,通过debug模式运行,观察H

15、ibernate发送SQL语句的时机Hibernate_SessionCache除提交事务(清理session缓存)之外,在一些特定情况,Hibernate会发送SQL语句,主要包括: 通过get方法加载,或者通过HQL语言查询时 当主键生成方式为数据库自增,调用save方法时示例(testUpdateStudent5方法)Hibernate_SessionCache在通过get方法加载,或者通过HQL语言查询时,Hibernate会发送SQL语句 说明:首先是从当前Session缓存中找,找不到再向数据库发送SQL语句Session清理缓存清理缓存: 针对缓存中的对象,执行必需的SQL语句,将对象状态同步到数据库之中,使两者之间保持一致session清理缓存的时机: 默认清理时间点:调用Transac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论