您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 工作计划 > HSE工作计划书(电气)
Hibernate中持久化对象的三种状态Session缓存Hibernate以持久化对象(PO)为基础,通过操作PO对象,进一步操作与PO对象关联的数据库表记录Hibernate编程,持久化对象主要存在三种状态▪瞬时状态(transientstate)▪持久状态(persistentstate)▪脱管状态(detachedstate)当程序中通过new操作符实例化一个PO对象,而这个对象还没有被Session对象操作,也就是没有和一个Session对象关联时,则称这个PO对象为瞬时状态对象瞬时状态对象的特点:▪没有与数据库表中的记录没有对应的映射关系Studentstu=newStudent();stu.setNumber(“1001”);..//省略其它属性设置Configurationcf=newConfiguration();cf.configure();SessionFactorysf=cf.buildSessionFactory();Sessionsession=sf.openSession();session.beginTransaction();session.save(stu);session.getTransaction.commit();session.close();stu对象此时为“瞬时状态对象”如果一个PO对象与一个Session对象相关联,比如被Session对象保存的、加载的、更新的,则称这个PO对象为持久状态对象▪“与Session对象相关联”:意思是:被HibernateSession对象所接管,处在Session对象工作单元之内Studentstu=newStudent();stu.setNumber(“1001”);..//省略其它属性设置Configurationcf=newConfiguration();cf.configure();SessionFactorysf=cf.buildSessionFactory();Sessionsession=sf.openSession();session.beginTransaction();session.save(stu);session.getTransaction.commit();session.close();stu对象此时为“持久状态对象”Studentstu=newStudent();stu.setId(1);stu.setNumber(“1001”);..//省略其它属性设置Configurationcf=newConfiguration();cf.configure();SessionFactorysf=cf.buildSessionFactory();Sessionsession=sf.openSession();session.beginTransaction();session.update(stu);session.getTransaction.commit();session.close();stu对象此时为“持久状态对象”Configurationcf=newConfiguration();cf.configure();SessionFactorysf=cf.buildSessionFactory();Sessionsession=sf.openSession();session.beginTransaction();Studentstu=(Student)session.get(Student.class,1);session.getTransaction.commit();session.close();stu对象此时为“持久状态对象”持久状态对象的特点:▪与数据库表中的一条记录有对应的映射关系▪与Session相关联,位于Session对象缓存之中持久状态对象有改变,事务提交之后,Hibernate会自动检测到其变化,并将变化反映到数据库之中当与持久状态对象关联的Session关闭后,该对象就变成脱管状态对象Configurationcf=newConfiguration();cf.configure();SessionFactorysf=cf.buildSessionFactory();Sessionsession=sf.openSession();session.beginTransaction();Studentstu=(Student)session.get(Student.class,1);session.getTransaction.commit();session.close();//在session关闭后,使用stu对象stu.setName(“tom2”);stu对象此时为“脱管状态对象”“脱管”含义提示“脱管”的含义:脱离了Session对象的管辖范围!脱管状态对象的特点:▪与数据库表中的一条记录有对应的映射关系▪没有与Session相关联,不位于Session对象缓存中当脱管状态对象再次与某个Session关联(即被某个Session接管)后,又会转变为持久状态对象…省略获取session对象操作步骤session.beginTransaction();Studentstu=(Student)session.get(Student.class,1);session.getTransaction.commit();session.close();//在session关闭后,使用stu对象stu.setName(“tom2”);//省略获取Session对象(名字session2)操作步骤session2.beginTransaction();session2.update(stu);session2.getTransaction.commit();stu对象此时为“脱管状态对象”stu对象此时又成为“持久状态对象”Hibernate持久化对象状态转变示例:▪示例数据文件:data1示例StudentTest测试类中的testAddAndUpdate方法Hibernate_ObjectState通过本小节,进一步理解Hibernate中的Session对象及工作原理Session的作用:▪Hibernate中的Session对象是用来进行数据操作的一个基本工作单元,通过Session对象对PO对象进行增、删、改、查等操作,进而执行对应数据表的相应操作Session缓存:▪HibernateSession对象维护着内存中的一块“缓存”空间,里面存放着持久状态对象“减少数据库访问频率”:▪查询时,首先查看缓存中是否存在,存在直接引用,不存在再查询数据库1Session缓存空间session.get(Student.class,1)OID为1的Student对象引用数据库OID为1的Student对象Hibernate将其放入当前Session对象的缓存从数据库读取加载一个OID为1的Student对象session.get(Student.class,1)下次查询时,先从缓存找是否存在OID为1的Student对象,有直接引用,没有再查数据库stuSession缓存示例▪示例数据文件:data1▪示例中StudentTest测试类的testGetStudent2()方法实验前提:数据表中有对应记录可以读取加载Hibernate_SessionCache“自动检查脏数据”(automaticdirtychecking)▪Hibernate从数据库中加载对象时,会在Session缓存里为该对象复制一份原始快照(snapshot)▪当Session清理缓存时,会将对象当前状态与原始快照进行对比,并将对比后的变动同步写回到数据库默认下,当事务提交时,Hibernate会清理Session缓存,使缓存中对象状态与数据库保持一致2Session缓存空间session.get(Student.class,1)Hibernate将其放入当前Session对象的缓存,并复制一份快照OID为1的Student对象引用数据库OID为1的Student对象从数据库读取加载一个OID为1的Student对象stu.setName(“tom1”)session.getTransaction.commit();事务提交,Session清理缓存,对比对象快照与当前属性状态,发现变动,自动更新至数据库,不需人为updatestuid:1name:tom…Session缓存示例▪示例中StudentTest测试类的testUpdateStudent2Hibernate_SessionCache持久状态对象:▪与数据库表中的一条记录有对应的映射关系▪与Session相关联,位于Session对象缓存之中脱管状态对象:▪与数据库表中的一条记录有对应的映射关系▪没有与Session相关联,不位于Session对象缓存中持久状态对象有改变,事务提交后,Hibernate自动检测到其变化,并将变化反映到数据库之中,脱管状态对象则不具备该特点▪示例(testUpdateStudent3方法)Hibernate_SessionCache“尽量延迟写入数据库的时间点,减少SQL语句的提交次数”Hibernate提交SQL语句的时机▪当Session清理缓存时▪其它一些特定情况,主要包括通过get方法加载,或者通过HQL语言查询时当主键生成方式为数据库自增,调用save方法时3当Session对象清理缓存时,Hibernate发送SQL语句▪清理缓存:默认,事务提交时,会清理缓存▪示例(testUpdateStudent4方法)掌握程序设置断点,通过debug模式运行,观察Hibernate发送SQL语句的时机Hibernate_SessionCache除提交事务(清理session缓存)之外,在一些特定情况,Hibernate会发送SQL语句,主要包括:▪通过get方法加载,或者通过HQL语言查询时▪当主键生成方式为数据库自增,调用save方法时示例(testUpdateStudent5方法)Hibernate_SessionCache在通过get方法加载,或者通过HQL语言查询时,Hibernate会发送SQL语句▪说明:首先是从当前Session缓存中找,找不到再向数据库发送SQL语句Session清理缓存:▪针对缓存中的对象,执行必需的SQL语句,将对象状态同步到数据库之中,使两者之间保持一致session清理缓存的时机:▪默认清理时间点:调用Transaction的commit方法,即事务提交时在程序中,调用Session对象flush方法,可以对Session进行刷出(flush),强制执行必需的SQL语句▪flush示例Hibernate_SessionCache(testUpdateStudent6方法)理解Hibernate持久化对象的三种状态理解HiberanteSession缓存的含义和作用理解Hibernate发送SQL语句的时机,掌握debug模式观察Hibernate程序发送sql语句的时机
本文标题:HSE工作计划书(电气)
链接地址:https://www.777doc.com/doc-2876297 .html