Hibernate之抓取策略
时间:2017-1-23 19:08
——区分延迟和立即检索
1、立即检索
当执行某行代码时,会马上发出SQL语句进行查询。
例如:get()
2、延迟检索
当执行某行代码时,不会马上发出SQL语句,只有当真正使用对象时,才会向数据库发出SQL语句。
例如:load()
3、示例代码
/*
——类级别检索和关联级别检索
1、类级别的检索:
1)类级别可选的检索策略包括立即检索和延迟检索,默认为延迟检索。
2)类级别的检索策略可以通过<class>元素的lazy属性进行设置。
3)如果程序加载一个对象的目的是为了访问它的属性,可以采取立即检索的方式,如果程序加载一个持久化对象的目的仅仅是为了获得它的引用,可以采用延迟检索。
4)无论<class>元素的lazy属性是true还是false,Session的get()方法以及Query的list()方法在类级别总是使用立即检索的策略。
5)若<class>元素的lazy属性为true或取默认值,Session的load()方法不会执行查询数据表的select语句,而是仅返回代理对象的实例,该代理对象实例有如下特征:
* 由Hibernate在运行时采用javassist工具动态生成
* Hibernate创建代理对象实例时,仅初始化其OID属性
* 在应用程序第一次访问代理实例的非OID属性时,Hibernate会初始化代理类实例。
2、关联级别的检索
1)在映射文件中,用<set>元素来配置一对多关联及多对多关联关系,<set>元素中有lazy和fetch属性:
2)lazy:主要决定orders集合被初始化的时机,即是否在Customer对象初始化时被加载,还是在程序访问orders集合时被初始化。
3)fetch:取值为select或subselect时,决定初始化orders的查询语句的形式,若取值为join,则决定orders集合被初始化的时机。
4)若把fetch设置为“join”,lazy属性将被忽略。
——一方关联多方的情况
在<set>元素中包含fetch和lazy属性:
* fetch:控制SQL语句的类型
> join:采用迫切左外连接查询
> select:默认值
> subselect:发送子查询来查询关联对象
* lazy:控制关联对象的检索是否采用延迟
> true:默认值,查询关联对象采用延迟检索
> false:查询关联对象不使用延迟检索
> extra:特懒
join:一次查完
select:分多次查完
lazy="true":延迟查询
lazy="false":不延迟查询
如果fetch="join",那么lazy属性将被忽略。
示例代码:
1)<set>集合中没有配置fetch和lazy的情况
默认值:fetch="select" lazy="true"
// 只发送查询客户的SQL语句,没有发送查询订单的SQL
SQL:
2)在<set>标签中配置fetch="join",lazy会被忽略
SQL:
Hibernate:
3)在<set>标签中配置fetch="select" lazy="extra"
SQL:
Hibernate:
4)在<set>标签中配置fetch="subselect" lazy="true"
SQL:
Hibernate:
——多方关联一方的情况
1、多对一和一对一关联的检索策略,和<set>一样,<many-to-one>元素也有一个lazy属性和fetch属性:
* 若fetch属性设为join,那么lazy属性被忽略。
* 迫切左外连接检索策略的优点在于比立即检索策略使用的select语句更少。
* 无代理延迟检索需要增强持久化类的字节码才能实现。
2、Query的list()方法会忽略映射文件配置的迫切左外连接检索策略,而采用延迟检索或立即检索策略,根据Customer类级别的lazy属性进行检索,lazy="true"为延迟检索,lazy="false"为立即检索。
3、如果在关联级别使用了延迟加载或立即加载检索策略,可以设定批量检索的大小,以帮助提高延迟检索或立即检索的运行性能。
4、<many-to-one>
* fetch:控制SQL语句发送格式
> join:使用迫切左外连接查询,lazy会被忽略
> select:发送多条SQL检索对象
* lazy:关联对象检索的时候,是否采用延迟
> false:不延迟
> proxy:使用代理,检索订单时是否马上检索客户,由Customer对象的映射文件中<class>元素的lazy属性来决定
> no-proxy:不使用代理
示例代码:
1)没有在<many-to-one>标签上进行配置
// 只查询订单的记录,拿到的是关联Customer的引用
SQL:
Hibernate:
2)在<many-to-one>标签上进行配置
* 发送迫切左外连接
// 发送一条迫切左外连接,将全部信息都获取到,并且封装到对象中
SQL:
Hibernate:
3)在<many-to-one>标签上设置
* fetch="select" lazy="false"
SQL:
Hibernate:
——批量抓取
1、从一方批量抓取多方记录
示例代码:
List<Customer> list = session.createQuery("from Customer").list();
SQL:
2、从多方批量抓取一方记录
不能在多方设置batch-size属性,需要在一方的<class>标签上设置batch-size。
——总结
1、立即检索
2、延迟检索
配置fetch和lazy属性
* 配置立即检索
> lazy="false"
> 持久化类设置为final
> 在调用方法的时候,初始化代理对象
3、延迟
类级别的延迟:
<class>元素上设置lazy
关联级别的延迟:
<set> / <many-to-many> / <one-to-one>
4、fetch属性
* <set>集合上的fetch:
> join:强制使用迫切左外连接
> select:默认值,会发送多条SQL语句
> subselect:使用子查询
* 在<many-to-one>标签上使用
> select:默认值,发送多条SQL
> join:强制使用迫切左外连接
5、lazy属性
* <set>
> true:默认值,延迟
> false:不采用延迟
> extra:极其懒惰
* <many-to-one>
> proxy:根据另一方的<calss>元素配置的lazy来确定是否使用延迟。
> false:不采用延迟。
> no-proxy
6、batch-size批量抓取
默认情况下只会检索一条记录,如果想要批量抓取多条记录,可以使用batch-size进行检索。
Hibernate之抓取策略的更多相关文章
- Hibernate的抓取策略(优化)
延迟加载的概述 什么是延迟加载 延迟加载:lazy(懒加载).执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询. 延迟加载的分类 l 类级别的延 ...
- 八 Hibernate延迟加载&抓取策略(优化)
面试:Hibernate效率很低,如何优化? 缓存怎么弄的,语句怎么优化? 聊聊一级缓存,聊聊抓取策略和延迟加载,聊聊批量抓取 延迟加载: 一般不单独使用,和延迟加载一起使用 延迟加载:lazy(懒加 ...
- Hibernate的抓取策略
立即检索:当执行某行代码的时候,马上发出SQL语句进行查询(get())延迟检索:当执行某行代码的时候,不会马上发出SQL语句进行查询.当真正使用这个对象的时候才会发送SQL语句(load()) 类级 ...
- 【Hibernate】抓取策略
一.区分延迟和立即检索 二.类级别检索和关联级别检索 一.区分延迟和立即检索 立即检索: 当执行某行代码的时候,马上发出SQL语句进行查询. get() 延迟检索: 当执行某行代码的时候,不会马上发出 ...
- 【Hibernate 8】Hibernate的调优方法:抓取策略
在上一篇博客中,介绍了Hibernate的缓存机制.合理的配置缓存,可以极大程度上优化Hibernate的性能.这篇博客,介绍另外一个调优方式:抓取策略. 一.什么是抓取策略 抓取策略(fetchin ...
- Hibernate框架笔记04HQL_QBC查询详解_抓取策略优化机制
目录 1. Hibernate的查询方式 1.1 方式一:OID查询 1.2 方式二:对象导航查询 1.3 方式三:HQL方式 1.4 方式四:QBC查询 1.5 方式五:SQL查询 2. 环境搭建 ...
- Hibernate(十四)抓取策略
抓取策略: 抓取策略是当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.Hibernate的抓取策略是Hibernate提升性能的一 ...
- Hibernate 抓取策略
抓取策略: 为了改变SQL语句执行的方式 当应用程序需要在Hibernate实体对象的关联关系间进行导航的时候,Hibernate如何获取关联对象的策略 抓取策略可以在O/R映射的元数据中声明,也可以 ...
- day36 08-Hibernate抓取策略:批量抓取
package cn.itcast.test; import java.util.List; import org.hibernate.Hibernate; import org.hibernate. ...
随机推荐
- 【算法学习笔记】概率与期望DP
本文学习自 Sengxian 学长的博客 之前也在CF上写了一些概率DP的题并做过总结 建议阅读完本文再去接着阅读这篇文章:Here 前言 单纯只用到概率的题并不是很多,从现有的 OI/ACM 比赛中 ...
- Scala学习——面向对象
Scala面向对象 三大特征:封装.继承.多态 1.类的定义和使用 package top.ruandb.scala.Course02 object Simple { def main(args: A ...
- Gos Log每次查询响应后自动清理临时文件,优化磁盘空间
客户端清理 logc/controllers/file/file.go 压缩后清理原始文件 //压缩成功后 删除原文件 os.Remove(src) 返回后清理压缩文件 defer func() { ...
- Python - 基础数据类型 dict 字典
字典简介 字典在 Python 里面是非常重要的数据类型,而且很常用 字典是以关键字(键)为索引,关键字(键)可以是任意不可变类型 字典由键和对应值成对组成,字典中所有的键值对放在 { } 中间,每一 ...
- Resnet网络详细结构(针对Cifar10)
Resnet网络详细结构(针对Cifar10) 结构 具体结构(Pytorch) conv1 (conv1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, ...
- kali linux重启网卡失败:Job for networking.service failed because the control process exited with error code. See "systemctl status networking.service" and "journalctl -xe" for details. 问题排查
linux菜鸡的时候,总是为了配置网络而烦恼,重启网卡的原因有很多,我这次是因为配置了固定IP[使用第三方工具连接]所以需要重启网卡,出现 Job for networking.service fai ...
- Java面向对象15——内部类
内部类(了解) 成员内部类 package oop.demon01.demon10; public class Outer { private int id = 10; pu ...
- C++ 友元 (全局函数做友元) (类做友元) (成员函数做友元)
1 //友元 全局函数做友元 2 /* 3 #include <iostream> 4 #include <string> 5 using namespace std; 6 7 ...
- 通读BadCode
简介 就是旋哥的BadCode系列,这次好好通读下,然后我在旋哥的注释上又加了一些,函数原型等. 项目地址:https://github.com/Rvn0xsy/BadCode 第一课 主要介绍了下c ...
- Java on Visual Studio Code的更新 – 2021年7月
Nick zhu, Senior Program Manager, Developer Division at Microsoft 大家好,欢迎来到 7 月版的 Visual Studio Code ...