第5章Hibernate高级特性(理论)_第1页
第5章Hibernate高级特性(理论)_第2页
第5章Hibernate高级特性(理论)_第3页
第5章Hibernate高级特性(理论)_第4页
第5章Hibernate高级特性(理论)_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

第5章Hibernate高级特性回顾HQL检索方式HQL检索步骤Criteria检索方式本章内容Hibernate实体对象的生命周期Hibernate缓存Hibernate检索策略本章目标了解Hibernate实体对象的生命周期掌握Hibernate实体对象状态变化掌握Hibernate缓存的作用掌握Hibernate二级缓存掌握Hibernate检索策略1.Hibernate实体对象的生命周期1.1Java实体对象在JVM中的生命周期在Java中可以利用new关键字来创建一个对象。JVM会为这个对象分配一块内存空间,只要这个变量被引用变量引用,它就一种存在于内存中。如果这个对象不被任何引用变量引用,它就结束生命周期1.2实体对象的状态实体对象的生命周期中包括3种状态临时状态(transient)持久化状态(persistent)游离状态(detached)1.3VO与PO值对象(VO):临时状态和游离状态统称为值对象(VO)持久对象(PO):处于持久化状态的对象称为持久对象(PO)VO和PO的主要区别VO是相对独立的实体对象,处于非管理状态如果一个PO与其对应的session实例分离,那么它将从一个PO变成VO1.4实体对象的状态之间的转换实体对象生命周期的3种状态可以相互转换实体对象的状态之间的转换实体对象各种状态之间转换的过程和生命周期的变化程序代码对象什么周期对象状态DeptdeptOne=newDept();deptOne.setDeptName("后勤部");deptOne.setCreateDate("2001-03-02");开始生命周期临时状态session.save(deptOne);处于生命周期转换为持久化状态IntegerdeptId=deptOne.getDeptId();deptOne=null;DeptdeptTwo=(Dept)session.load(Dept.class,deptId);mit();处于生命周期处于持久化状态session.close();处于生命周期转换为游离态System.out.println("部门名称:"+deptTwo.getDeptName());处于生命周期处于游离态deptTwo=null;生命周期结束结束生命周期2.Hibernate缓存2.1什么是数据缓存缓存是数据库数据在内存中的临时容器,它包含了数据库表的数据在内存中的临时拷贝,位于数据库和数据访问层之间2.2数据缓存的策略ORM的数据缓存策略包括3种事务级缓存应用级缓存分布式缓存2.3什么是Hibernate数据缓存为了提高性能,Hibernate也使用了缓冲机制。在Hibernate的框架中,主要包括一级缓存和二级缓存Hibernate缓存主要两个方面发生作用通过主键值加载数据延迟加载2.4Hibernate一级缓存Hibernate一级缓存由session提供,它的存在和session的生命周期有关,当session关闭的时候,session管理的一级缓存也就消失session提供对一级缓存进行手工干预的方法evict():用于将某个对象从session的一级缓存中清除clear():用于将一级缓存中的对象全部清除Hibernate一级缓存一个Session中不能同时存在两个ID相同的持久化对象例如,id为deptId的deptOne对象已经存在Session中,这时如果Session中试图产生一个deptTow对象Transactiontr=session.beginTransaction();IntegerdeptId=newInteger(21);DeptdeptOne=(Dept)session.get(Dept.class,deptId);DeptdeptTow=newDept();deptTow.setDeptId(deptId);deptTow.setDeptName("采购部");deptTow.setCreateDate("2001-04-02");session.update(deptTow);mit();第一个ID为deptId对象第二个ID为deptId对象Hibernate一级缓存出现的错误一个Session中同时存在两个ID相同的持久化对象Hibernate一级缓存出现这种错误的主要原因是一个Session中不能同时存在两个ID相同的持久化对象,针对这种错误,我们可以在程序中加上一个evict方法,将其中一个对象从session中清除Transactiontr=session.beginTransaction();IntegerdeptId=newInteger(21);DeptdeptOne=(Dept)session.get(Dept.class,deptId);DeptdeptTow=newDept();deptTow.setDeptId(deptId);deptTow.setDeptName("采购部");deptTow.setCreateDate("2001-04-02");session.evict(deptOne);session.update(deptTow);mit();将第一个ID为deptId的对象从缓存中清除Hibernate一级缓存调用clear方法清空一级缓存中的对象Transactiontr=session.beginTransaction();for(inti=0;i<10000;i++){ DeptdeptTow=newDept(); deptTow.setDeptName("采购部"); deptTow.setCreateDate("2001-04-02"); session.save(deptTow);

if(i%20==0){ session.flush(); session.clear(); }} mit();session.close();添加20条记录后清空一级缓存2.5Hibernate二级缓存Hibernate二级缓存是一个可插拔的的缓存插件,由SessionFactory负责管理Hibernate二级缓存Hibernate二级缓存的工作概括如下查询结果集为实体对象的集合,就把所有实体对象根据ID值放入二级缓存中根据ID查询,首先从一级缓存中查找,如果查不到并且配置了二级缓存,就从二级缓存中查找,如果还查不到就会查询数据库,把结果按照ID放入缓存中删除、更新和增加数据时,同时更新缓存Hibernate二级缓存二级缓存查询机制Hibernate二级缓存适合放入Hibernate二级缓存的数据较少被修改的数据不重要、容许出现偶尔并发的数据不会被并发访问的数据参数数据不适合放入Hibernate二级缓存的数据经常被修改的数据绝不容许出现并发的数据与其他应用共享的数据2.6Hibernate缓存的应用通过ID获得单独Java对象的load方法和get方法load方法:先查一级缓存,然后根据是否存在二级缓存配置来查询二级缓存,如果仍然获取不到则在数据库中获取,最后将获取的值填充一级缓存get方法:get方法和load方法的区别在于是否查询二级缓存,如果get方法获得不到指定对象时会直接从数据库中查询Hibernate缓存的应用HQL执行数据库的查询的list方法和iterator方法list方法:首先检查是否配置了查询缓存,如果配置了查询缓存则从查询缓存中寻找是否已经对该查询进行了缓冲,否则从数据库中进行获取。然后填充一级缓存、二级缓存和查询缓存iterator方法:首先会使用查询语句获得ID值的列表,然后使用session的load方法获得所需要对象的值3.Hibernate检索策略3.1Hibernate检索策略简介Hibernate的检索策略包括类级别检索策略和关联级别检索策略类级别检索:立即检索和延迟检索关联级别检索:立即检索、延迟检索和迫切左外连接检索3.2类级别检索策略立即检索类级别的立即检索只影响load方法@TestpublicvoidtestQueryLoad1(){ Deptdept=(Dept)session.load(Dept.class,newInteger(2));}类级别检索策略映射文件<hibernate-mapping><classname="com.hr.g3.persist.Dept"lazy="false"table="dept" catalog="hqt_t1"><idname="deptId"type="java.lang.Integer"><columnname="DEPT_ID"/><generatorclass="native"/></id><setname="employees"inverse="true"><key><columnname="DEPT_ID"/></key><one-to-manyclass="com.hr.g3.persist.Employee"/></set></class></hibernate-mapping>立即检索类级别检索策略运行结果立即检索不管是否用到查询结果,都有SQL语句输出类级别检索策略延迟检索<hibernate-mapping><classname="com.hr.g3.persist.Dept"lazy=“true"table="dept" catalog="hqt_t1"><idname="deptId"type="java.lang.Integer"><columnname="DEPT_ID"/><generatorclass="native"/></id><setname="employees"inverse="true"><key><columnname="DEPT_ID"/></key><one-to-manyclass="com.hr.g3.persist.Employee"/></set></class></hibernate-mapping>延迟检索,默认是延迟检索类级别检索策略延迟检索返回代理类的实例具有的特征它在Hibernate运行时动态生成创建代理类实例的时候,仅仅初始化了OID属性,其他属性都为null第一次访问代理类实例时,Hibernate会初始化代理类的实例类级别检索策略显式初始化代理实例@TestpublicvoidtestQueryLoad4(){ Deptdept=(Dept)session.load(Dept.class,newInteger(2)); Hibernate.initialize(dept.getDeptName()); System.out.println("部门名称:"+dept.getDeptName());}显式地初始化代理实例3.3关联级别检索策略立即检索设置一对多的关联级别检索方式为立即检索@TestpublicvoidtestQueryRaLoad1(){ Deptdept=(Dept)session.load(Dept.class,newInteger(2)); System.out.println("员工名称:"+dept.getDeptName()); System.out.println("开始检索员工"); System.out.println("部门员工数量:"+dept.getEmployees().size()); }关联级别检索策略映射文件<hibernate-mapping><classname="com.hr.g3.persist.Dept"lazy="true"table="dept" catalog="hqt_t1"><idname="deptId"type="java.lang.Integer"><columnname="DEPT_ID"/><generatorclass="native"/></id><setname="employees"lazy="false"><key><columnname="DEPT_ID"/></key><one-to-manyclass="com.hr.g3.persist.Employee"/></set></class></hibernate-mapping>立即检索关联级别检索策略运行结果建议:一对多的关联级别检索方式不要使用立即检索在输出结果前不仅执行查询部门的操作,还查询员工关联级别检索策略延迟检索<hibernate-mapping><classname="com.hr.g3.persist.Dept"lazy="true"table="dept"catalog="hqt_t1"><idname="deptId"type="java.lang.Integer"><columnname="DEPT_ID"/><generatorclass="native"/></id><setname="employees"lazy="true"inverse="true"><key><columnname="DEPT_ID"/></key><one-to-manyclass="com.hr.g3.persist.Employee"

温馨提示

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

评论

0/150

提交评论