Hibernate5-课程笔记6

Hibernate检索优化:

  检索即查询。为了减轻DB的访问压力,提高检索效率,Hibernate对检索进行了优化。
  所谓检索优化,指的是对查询语句的执行时机进行了细致、严格的把控:并不是代码中一出现查询语句,马上就在后台调用执行select语句。而是在代码中真正需要时才执行select。即将select的执行进行了最大可能的“延迟”。
  对对象进行检索的目的是为了将对象加载到内存,让程序使用其数据。所以,对象检索也称为对象加载。根据检索对象的不同,可以将检索优化分为两类:  (1)当前对象检索优化 (2)关联对象检索优化
  对于不使用优化进行对象检索的过程,称为直接加载;否则称为延迟加载,或懒加载。 延迟加载的底层实现,在Hibernate3.3版本之前使用的是CGLIB生成代理实现的,而3.3版本以后是由javassist代理实现的。若实体类使用final修饰,将无法生成CGLIB代理,即对于3.3版本之前的Hibernate将无法实现延迟加载。考虑到对老版本代码的兼容问题,实体类最好不要使用final修饰。  

  (1)当前对象检索优化:

    对于当前对象进行检索加载,Session中提供了两个方法:get()与load()。  默认情况下,get()为直接加载,而load()为延迟加载。
    get()方法的直接加载指,当代码中出现get()时,后台马上会调用执行select语句,将对象直接加载到内存。
    load()方法的延迟加载指,当代码中出现load()时,后台并不会马上调用执行select。只有当代码中真正在访问除了主键id属性以外的其它属性时,才会真正执行select语句,即此时才会将对象真正加载到内存。

    oad()方法默认情况下采用延迟加载策略,但也是可以改变的,可以改为直接加载。在该类映射文件的<class/>标签中有个属性lazy,其默认值为true,即采用延迟加载策略。将其值修改为false,load()的执行也将采用直接加载。

  (2)关联对象检索优化:

    对于关联对象的检索,也可进行延迟加载的优化。采用何种优化策略,要依据映射文件的配置。映射文件中对于关联对象检索的优化配置属性有两个:lazy、fetch。 
    lazy与fetch各具有若干值,它们不同值的组合,表示不同的对象加载策略。  根据这两个属性配置位置的不同,又分为两种:  (1)多端配置优化  (2)单端配置优化

    (1)多端加载优化(在一方对象的映射文件中配置属性):

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5
 6 <hibernate-mapping package="com.tongji.beans">
 7     <class name="Country">
 8         <id name="cid">
 9             <generator class="native"/>
10         </id>
11         <property name="cname"/>
12         <!-- 左外连接查询,不存在延迟加载问题,也就不存在多端加载优化问题 ,所以不用lazy-->
13         <!-- <set name="ministers" cascade="all" fetch="join"> -->
14         <!-- 普通查询(两表分别查询),不使用延迟加载,则查找当前对象的时候,不管关联对象是否用到,都会一起加载 -->
15         <!-- <set name="ministers" cascade="all" fetch="select" lazy="false"> -->
16         <!-- 普通查询,使用延迟加载,则查找当前对象的时候,不加载关联对象,直到用到关联对象的时候,才会加载关联对象 -->
17         <!-- <set name="ministers" cascade="all" fetch="select" lazy="true"> -->
18         <!-- 普通查询,特别延迟,则查找当前对象的时候,不加载关联对象,并且用到关联对象的时候,能用聚合查询的时候,就不做详情查询 -->
19         <!-- <set name="ministers" cascade="all" fetch="select" lazy="extra"> -->
20         <!-- 补充:子查询,效果同普通查询,其实Hibernate5不支持该策略,但为了兼容以前的版本,对subselect进行了保留 -->
21         <!-- <set name="ministers" cascade="all" fetch="subselect" lazy="extra"> -->
22         <!-- 默认使用,fetch="select" lazy="true"这种格式 -->
23         <set name="ministers" cascade="save-update">
24             <key column="countryId"/>
25             <one-to-many class="Minister"/>
26         </set>
27     </class>
28 </hibernate-mapping>

    测试代码:

 1 @Test
 2 public void test01() {
 3     //1. 获取Session
 4     Session session = HbnUtils.getSession();
 5     try {
 6         //2. 开启事务
 7         session.beginTransaction();
 8         //3. 操作
 9         Country country = session.get(Country.class, 1);
10         Set<Minister> ministers = country.getMinisters();
11         //集合大小的输出
12         System.out.println("ministers.size() = " + ministers.size());
13         //集合详情的输出
14         System.out.println(ministers);
15         //4. 事务提交
16         session.getTransaction().commit();
17     } catch (Exception e) {
18         e.printStackTrace();
19         //5. 事务回滚
20         session.getTransaction().rollback();
21     }
22 }

    (2)单端加载优化(在多方对象的映射文件配置属性):

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5
 6 <hibernate-mapping package="com.tongji.beans">
 7     <class name="Minister">
 8         <id name="mid">
 9             <generator class="native"/>
10         </id>
11         <property name="mname"/>
12         <!-- 关联属性名 -->
13         <!-- 左外连接查询,同多端加载优化 -->
14         <!-- <many-to-one name="country" cascade="save-update"
15             class="Country" column="countryId" fetch="join"/> -->
16         <!-- 普通查询之直接加载,同多端加载优化 -->
17         <!-- <many-to-one name="country" cascade="save-update"
18             class="Country" column="countryId" fetch="select" lazy="false"/> -->
19         <!-- 普通查询,是否延迟加载,由关联对象的lazy值决定-->
20         <many-to-one name="country" cascade="save-update"
21             class="Country" column="countryId" fetch="select" lazy="proxy"/>
22         <!-- 补充:no-proxy和proxy基本相同,但是会对字节码进行加强 -->
23         <!-- <many-to-one name="country" cascade="save-update"
24             class="Country" column="countryId" fetch="select" lazy="no-proxy"/> -->
25     </class>
26 </hibernate-mapping>
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5
 6 <hibernate-mapping package="com.tongji.beans">
 7     <!-- 单端加载优化,之普通查询,直接加载-->
 8     <!-- <class name="Country" lazy="true"> -->
 9     <!-- 单端加载优化,之普通查询,延迟加载 ,默认-->
10     <class name="Country" lazy="true">
11         <id name="cid">
12             <generator class="native"/>
13         </id>
14         <property name="cname"/>
15         <set name="ministers" cascade="all">
16             <key column="countryId"/>
17             <one-to-many class="Minister"/>
18         </set>
19     </class>
20 </hibernate-mapping>

    测试代码:

 1 @Test
 2 public void test01() {
 3     //1. 获取Session
 4     Session session = HbnUtils.getSession();
 5     try {
 6         //2. 开启事务
 7         session.beginTransaction();
 8         //3. 操作
 9         Minister minister = session.get(Minister.class, 2);
10         Country country = minister.getCountry();
11
12         System.out.println("country.id = " + country.getCid());
13         System.out.println("country.name = " + country.getCname());
14         //4. 事务提交
15         session.getTransaction().commit();
16     } catch (Exception e) {
17         e.printStackTrace();
18         //5. 事务回滚
19         session.getTransaction().rollback();
20     }
21 }

 

时间: 2024-10-19 16:38:51

Hibernate5-课程笔记6的相关文章

《nodejs+gulp+webpack基础实战篇》课程笔记(四)-- 实战演练

一.用gulp 构建前端页面(1)---静态构建 npm install gulp-template --save-dev 通过这个插件,我们可以像写后台模板(譬如PHP)一样写前端页面.我们首先学习一下写法. 现在我们创建一个新任务:创建一个裸的index.html文件,然后在body里面写上 ,我的年龄是:<%= age %> 下载好gulp-template,我们引用并配置 var gulp_tpl = require("gulp-template"); gp.tas

Linux操作系统及应用课程笔记 索引

第0部分  软件的安装与配置 Linux下软件的安装与配置 第1部分*   绪论 第2部分*  Linux的安装过程 第3部分   系统Shell和常用命令 Shell文件相关常用命令及参数总结 Linux下常用命令 第4部分  VI编辑器 Linux下vi编辑器的使用 <<学习vi和vim编辑器>>1 <<学习vi和vim编辑器>>2 第5部分  Shell脚本 Shell入门之脚本管理 Shell入门之测试操作 Shell入门之条件循环 Shell入门之

Andrew Ng机器学习课程笔记(五)之应用机器学习的建议

Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.html 前言 学习了Andrew Ng课程,开始写了一些笔记,现在写完第5章了,先把这5章的内容放在博客中,后面的内容会陆续更新! 这篇博客主要记录了Andrew Ng课程第五章应用机器学习的建议,主要介绍了在测试新数据出现较大误差该怎么处理,这期间讲到了数据集的分类,偏差,方差,学习曲线等概念,帮

JAVA课程笔记_1

一 课程内容 set path查看路径信息:当编译一个程序或命令时,先从当前目录查找,如果没有,按path中的路径按顺序查找,先找到后就不查找后面的路径了. 可以将目录加入环境变量,set path="复制的路径" 可以在.java程序中编写多个类,当编译时,每个类生成各自的字节码文件. 由于多个类的字节码文件不利于管理,使用bin目录下的jar命令可以将多个字节码文件打包成jar包发布给其他程序员使用. 使用方法:先在命令提示符下输入jar,会出现使用方法和实例.Jar打包两个cla

Django开发BBS---51网络课程笔记(目录)

这是51cto中bbs课程中的一个项目,这里写一下每节的目录: Django开发BBS---51网络课程笔记(1) 这部分主要介绍了数据库的搭建及站点管理 http://4440271.blog.51cto.com/4430271/1663863 Bootstrap开发 这不分主要讲前端的设计 http://4440271.blog.51cto.com/4430271/1663934 Django开发BBS---51网络课程笔记(2) 这部分主要讲view与前端的衔接部分 http://4440

跟我学《JavaScript高程3》第三讲,课程笔记

跟我学<JavaScript高程3> 第三讲:第4章 课程制作:bling,兴哥,5年Java,3年前端 课程知识:JavaScript.Html.Css 课程目标:前端体系课程,逐步深入,找到一份前端工作    课程大纲:本书目录结构 适合人群:前端初学者,可以0基础,但要认真,踏实 课程回顾 1.数据类型:5种基本类型,1中复杂类型. 2.操作符:需要注意运算优先级,算关逻条赋逗. 3.语句:if-else.for.for-in.while 4.函数:函数定义,目前的两种方法 补充:变量在

【课程笔记】需求挖掘与分析

*…* 产品定位与分析有三部分内容:需求分析.用户调研.市场分析. 下面是前两部分内容的课程笔记,整理成思维导图.

(转)妙味课堂—JavaScrip中级课程笔记

DOM基础概念.操作 DOM的概念及节点类型 childNodes children nodeType attributes 子节点和兄弟节点的操作 firstChild firstElementChild lastChild.lastElementChild nextSibling.previousSibling 父节点 parentNode offsetParent 元素位置宽高 offsetLeft.offsetTop offsetWidth.offsetHeight getPos() 操

Android网络项目课程笔记-----Volley框架

Volley 问题原因: Android4.x版本和2.x对AsyncTask的机制不同 2.x之中,同时执行5个,4.x同时只有一个 解决思路: 1) 使用Thread + Handler 注意: 使用线程池 2) 定制AsyncTask线程池 3) 开源框架Volley 1. 检查网络 2. 退出 3. 总结 有待改进 做的比较好的 商业级项目: 1) 稳定性   不要轻易FC    运行时异常 2) 用户体验:流畅(性能)/美观 3) 可扩展性 4) 可读性 5) 异常流程:提示 + 指导

Android网络项目课程笔记-----计划

目标:好用 充分:1) 角色完整 产品经理   灵魂 美工  交互设计师 开发   架构师 开发者 测试 小部分用户 2) 运营推广 基础:能用 必须: 1) API   框架 2) 模块(一个功能集合) * 3) 业务流程 4) bug 具备解决大部分中等难度bug的能力 5) 自学新技术的能力 6) 阅读代码 不合格:1) 做不了,有难度.需要很长时间 2) 只是做了,对过程负责.对结果不负责 3) 只是掌握了某个功能的基本实现方法,一旦出了bug, 解决效率很低 4) 没做过,没把握 合格