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语句,即此时才会将对象真正加载到内存。

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

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

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

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

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

    测试代码:

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

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

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

    测试代码:

 @Test
public void test01() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
Minister minister = session.get(Minister.class, 2);
Country country = minister.getCountry(); System.out.println("country.id = " + country.getCid());
System.out.println("country.name = " + country.getCname());
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}

 

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

  1. Linux内核分析课程笔记(一)

    linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...

  2. (1/18)重学Standford_iOS7开发_iOS概述_课程笔记

    写在前面:上次学习课程对iOS还是一知半解,由于缺乏实践,看公开课的视频有时不能很好地领会知识.带着问题去学习永远是最好的方法,接触一段时间iOS开发以后再来看斯坦福iOS公开课,又会有许多新的发现, ...

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

    Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.h ...

  4. Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)

    title: Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归) tags: 机器学习, 学习笔记 grammar_cjkRuby: true --- 之前看过一遍,但是总是模 ...

  5. Andrew Ng机器学习课程笔记--汇总

    笔记总结,各章节主要内容已总结在标题之中 Andrew Ng机器学习课程笔记–week1(机器学习简介&线性回归模型) Andrew Ng机器学习课程笔记--week2(多元线性回归& ...

  6. Andrew 机器学习课程笔记

    Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...

  7. 操作系统学习笔记----进程/线程模型----Coursera课程笔记

    操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...

  8. 《CSS动画实用技巧》课程笔记

    概述 这是我学习[CSS动画实用技巧][1]的课程笔记 常用动画属性--transition [常用动画属性--transition][2] .change img{ display:block; w ...

  9. Deeplearning.ai课程笔记--汇总

    从接触机器学习就了解到Andrew Ng的机器学习课程,后来发现又出来深度学习课程,就开始在网易云课堂上学习deeplearning.ai的课程,Andrew 的课真是的把深入浅出.当然学习这些课程还 ...

  10. selenium课程笔记

    selenium课程笔记第一天(2017-7-1) 一.配置火狐浏览器 运行:firefox.exe -p -no -remote selenium课程笔记第二天 用Eclipse+java+sele ...

随机推荐

  1. java中outer的使用

    outer多用于嵌套循环的情况 outer: for (int i = 2 ; i <= 10 ; i++) { for (int j = 2 ; j <=10 ; j++) { if(i ...

  2. Hexo+NextT第三方服务调用【4】

    该系列博客列表请访问:http://www.cnblogs.com/penglei-it/category/934299.html 摘要        静态站点与动态站点有很大的不一样,它拥有一定的局 ...

  3. UIView的生命周期和layout方法总结

    生命周期 1. loadView 什么时候调用? 每次访问UIViewController的view时候并且view == nil时候调用. 如何实现? 1> 如果在初始化UIViewContr ...

  4. C语言之算数运算符

    一 什么是算数运算符 算术运算符: +:  就是把两个数据相加,得到和 -:  就是把两个数据相减,得到差 *:  就是把两个数据相乘,得到积 /:  就是把两个数据相除,得到商 %:  就是把两个数 ...

  5. ColumnEdit 数据源修改

    应用场景 当从ColumnEdit(如SearchLookUpEdit)中选取一条记录后,ColumnEdit的数据源不再出现这条记录.效果图如下 选择前 选择一条记录后,上一条记录不再显示. 此处是 ...

  6. python3.5学习之路_day1_login

    登录程序1.输入用户名密码2.认证成功后显示欢迎信息3.输错三次后锁定 #!/usr/bin/env python #_*_coding:utf-8_*_ #by anthor zhangxiaoyu ...

  7. Matlab最新的官方文档中文翻译

    文章翻译的是Matlab最新的官方文档R2016b,可能后续如果我还有时间会继续翻译,希望能够帮到大家,翻译的不好请大家不要吐槽. Matlab官方文档地址:http://cn.mathworks.c ...

  8. mysql报错1024-can't get hostname for your address

    前一段时间mysql用的好好的,突然一天,mysql启动后,在使用navicat连接数据库的时候 报错1024-can't get hostname for your address 这里我是这样解决 ...

  9. input的placeholder字体大小无法修改?

    链接如下 其实chrome是有这个东西的,那就是shadow DOM. 什么是Shadow-Dom?Shadow DOM是指浏览器的一种能力,它允许在文档(document)渲染时插入一棵DOM元素子 ...

  10. Weblogic概念与基础

    WebLogic Server 1.BEA WebLogic Server 1.Domain:域是个逻辑概念,用来组织管理一系列的应用服务器实例,中心配置文件Config.xml. 2.Cluster ...