Hibernate的三种检索策略
1 N+1问题
Hibernate的Session缓存中存放的是相互关联的对象图,默认情况下,当从数据库中加载一个对象的时候,会同时加载它所关联的其他对象。例如:Clazz(班级)跟Student(学生)是1:N关联关系。Clazz对象中有Student对象的集合。具体例子可参见笔者的另一篇文章,《Hibernate初体验》[url]http://frank1234.iteye.com/blog/2172205[/url] 。
如果要执行语句:
List list = session.createQuery("from Clazz").list();
假设clazz表中有3条记录,id分别等于1、2、3。
那么默认情况下Hibernate会执行如下语句:
select * from clazz;
select * from student where clazzid=1;
select * from student where clazzid=2;
select * from student where clazzid=3;
可见clazz表中有3条记录则执行了3+1条语句,这就是n+1问题,由于用户加载了Clazz 未必想查询班级中的学生,但是却多执行了3条SQL语句,这对性能的影响是巨大的,所以针对这种情况Hibernate 提供了三种不同的检索策略。
2 三种检索策略
1)立即检索:立即加载指定的对象及对应的关联对象,这是Hibernate默认的检索策略,如上n+1问题所述。
适用场景:通常类级别的的检索适合这种策略,因为加载的对象通常都会用到。
2)延迟检索:延迟加载指定的对象及对应的关联对象,如n+1问题中,只执行select * from clazz,而不立即执行后面的3条语句,等真正用到的时候才执行,这就带来了巨大的性能提升。
适用场景:它通常适用于一对多和多对多关联场景,因为关联对象不一定会用到。
3)迫切左外连接检索:通过左外连接加载指定的对象及对应的关联对象。例如对于n+1问题,执行的SQL语句变为:
select * from clazz a left join student b on a.id=b.clazzid; 这样也会某种程度的提升性能。
适用场景:适用于多对一和一对一关联场景,并且关联查询性能较好的场景。
其实如果考虑数据库缓存命中率的话,N+1次select未必比这种关联方式慢。
3 类级别的检索策略
1)立即检索:<class [color=red][b]lazy="false"[/b][/color]>
如1中所述的n+1问题,会立即检索指定的对象及对应的关联对象。
2)延迟检索:<class [color=red][b]lazy="true"[/b][/color]> 。
Clazz course = (Course)session.load(Clazz.class, 1);
延迟检索会返回一个Clazz类的代理类的实例,Hibernate是通过CGLib字节码增强技术实现的,生成的代理类继承了Clazz类。然后根据load的第二个参数设置了对象的id属性,其他属性的值为空。当执行getxxx()或者setxxx()方法时,才真正的到数据库中检索数据。这个xxx不含id属性,load完后执行getId()仍然不需要走库,因为生成代理类对象的时候id已经赋值了。
Hibernate3.x默认是true
延迟检索仅对load()方法生效,[color=red][b]get()等方法总是采用立即检索策略[/b][/color]。
Hibernate的三种检索策略相关推荐
- 深入hibernate的三种状态
转载自:http://www.cnblogs.com/xiaoluo501395377/p/3380270.html 学过hibernate的人都可能都知道hibernate有三种状态,transie ...
- (详细)Hibernate查询技术(Query、Session、Criteria),Hibernate的三种状态,Hibernate集合struts2实现登录功能(二)
一.Hibernate的三种查询方式(掌握) Hibernate中提供了三种查询方式: 1)Session的查询:按主键查询查询,方法为get或load 2)Query的查询:使用HQL语句或SQL语 ...
- Git工作流中常见的三种分支策略:GitFlow、GitHubFlow和GitLabFlow
摘要:聊一聊Git中的工作流--分支策略. 本文分享自华为云社区<Git工作流中常见的三种分支策略:GitFlow.GitHubFlow以及GitLabFlow>,原文作者:敏捷的小智. ...
- 会员营销中,沉寂会员的三种运营策略
在会员营销中,企业主要做的主要有两件事情,第一件事情就是想办法将用户转化成企业会员:第二件事就是将会员进行转化,达成企业收益提升以及用户增长的目的,这就是开展企业会员营销时企业需要做的两件事情,这两件 ...
- 数据库恢复技术(事物、三种更新策略以及恢复策略)
数据库恢复技术(事物.三种更新策略以及恢复策略) 数据库恢复所要达到的目标 数据库为了达到目标的恢复策略 事务和日志的基本内容 事务的基本内容 日志的基本内容 更新数据库规则和三种更新策略 数据库更新 ...
- 信贷风控的三种模型策略体系
互联网金融浩浩荡荡不过十载,时间上看虽然不长,但从影响上规模上不可不谓之巨变.这一点从名字上就可以看出来,广为人知的是互联网金融,而不是曾经许多专家学家们激烈争论的金融互联网.传统金融互联网化实在不足 ...
- 负载均衡方案的三种实现策略
早期的互联网应用,由于用户流量比较小,业务逻辑也比较简单,往往一个单服务器就能满足负载需求.随着现在互联网的流量越来越大,稍微好一点的系统,访问量就非常大了,并且系统功能也越来越复杂,那么单台服务器就 ...
- 举例理解Hibernate的三种状态:瞬时态、持久态、托管(即游离态)态及互相转化
举例理解Hibernate的三种状态 初学Hibernate,了解到Hibernate有三种状态:transient(瞬时状态),persistent(持久化状态)以及detached(游离状态). ...
- Azure数据仓库表中的数据经常使用的三种分布策略(hash、round_robin 或 replicated)简介
目录 (一)前言 (二)基础概念 1. Azure Synapse Analytics概念 2. Synapse SQL 体系结构组件 3. Azure 存储 4. 控制节点 5. 计算节点 6. 数 ...
最新文章
- 快速原型工具 原型可视化
- 十年研发经验嵌入式工程师书籍推荐
- Redis如何淘汰过期的keys
- 复杂的数据类型3 - C++快速入门09
- numpy zeros矩阵_零矩阵使用numpy.zeros()| 使用Python的线性代数
- 深入理解BFC和Margin Collapse
- 《统计学习方法》的Python 3.6复现,实测可用
- AD域控exchange邮箱(一)——批量安装MSI安装包
- 研究发现,近一半生产容器存在漏洞
- OpenDDS 安全配置
- MT4本地跟单使用说明
- 创意信件风格论文答辩PPT模板
- 分布式系统的经典基础理论
- spring boot 整合 ip2region(ip地址库)
- HDU 613 Kolakoski
- linux密码是什么加密方式,Linux系统的几种加密
- 做毕设|墨墨背单词+单词本(小程序)01
- 估计π的第一种方法:蒲丰(buffon)投针
- IllegalArgumentException
- 圣诞节计算机老师贺卡祝福语,给老师的圣诞节贺卡祝福语
热门文章
- e480换高分屏_ThinkPadE480电脑(i5-8250u 8G内存 256G固态 高分屏0QCD 14英寸) 京东5699元...
- 使用HFS+cpolar组合 低成本搭建NAS(1)
- linux centos7以上的自带监控界面cockpit案例
- 收单外包机构备案业务类型汇总分析
- 同时打开多个远程桌面连
- android应用开发入门
- 1.1Ad Hoc 网络概述
- 二进制与或非逻辑计算机,深度学习(1):给感知机做准备,谈谈二进制和与或非门。...
- 《A Survey on Transfer Learning》中文版翻译《迁移学习研究综述》
- 基于springboot+mybatis+mysql+html企业人事管理系统