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的三种检索策略相关推荐

  1. 深入hibernate的三种状态

    转载自:http://www.cnblogs.com/xiaoluo501395377/p/3380270.html 学过hibernate的人都可能都知道hibernate有三种状态,transie ...

  2. (详细)Hibernate查询技术(Query、Session、Criteria),Hibernate的三种状态,Hibernate集合struts2实现登录功能(二)

    一.Hibernate的三种查询方式(掌握) Hibernate中提供了三种查询方式: 1)Session的查询:按主键查询查询,方法为get或load 2)Query的查询:使用HQL语句或SQL语 ...

  3. Git工作流中常见的三种分支策略:GitFlow、GitHubFlow和GitLabFlow

    摘要:聊一聊Git中的工作流--分支策略. 本文分享自华为云社区<Git工作流中常见的三种分支策略:GitFlow.GitHubFlow以及GitLabFlow>,原文作者:敏捷的小智. ...

  4. 会员营销中,沉寂会员的三种运营策略

    在会员营销中,企业主要做的主要有两件事情,第一件事情就是想办法将用户转化成企业会员:第二件事就是将会员进行转化,达成企业收益提升以及用户增长的目的,这就是开展企业会员营销时企业需要做的两件事情,这两件 ...

  5. 数据库恢复技术(事物、三种更新策略以及恢复策略)

    数据库恢复技术(事物.三种更新策略以及恢复策略) 数据库恢复所要达到的目标 数据库为了达到目标的恢复策略 事务和日志的基本内容 事务的基本内容 日志的基本内容 更新数据库规则和三种更新策略 数据库更新 ...

  6. 信贷风控的三种模型策略体系

    互联网金融浩浩荡荡不过十载,时间上看虽然不长,但从影响上规模上不可不谓之巨变.这一点从名字上就可以看出来,广为人知的是互联网金融,而不是曾经许多专家学家们激烈争论的金融互联网.传统金融互联网化实在不足 ...

  7. 负载均衡方案的三种实现策略

    早期的互联网应用,由于用户流量比较小,业务逻辑也比较简单,往往一个单服务器就能满足负载需求.随着现在互联网的流量越来越大,稍微好一点的系统,访问量就非常大了,并且系统功能也越来越复杂,那么单台服务器就 ...

  8. 举例理解Hibernate的三种状态:瞬时态、持久态、托管(即游离态)态及互相转化

    举例理解Hibernate的三种状态 初学Hibernate,了解到Hibernate有三种状态:transient(瞬时状态),persistent(持久化状态)以及detached(游离状态). ...

  9. Azure数据仓库表中的数据经常使用的三种分布策略(hash、round_robin 或 replicated)简介

    目录 (一)前言 (二)基础概念 1. Azure Synapse Analytics概念 2. Synapse SQL 体系结构组件 3. Azure 存储 4. 控制节点 5. 计算节点 6. 数 ...

最新文章

  1. 快速原型工具 原型可视化
  2. 十年研发经验嵌入式工程师书籍推荐
  3. Redis如何淘汰过期的keys
  4. 复杂的数据类型3 - C++快速入门09
  5. numpy zeros矩阵_零矩阵使用numpy.zeros()| 使用Python的线性代数
  6. 深入理解BFC和Margin Collapse
  7. 《统计学习方法》的Python 3.6复现,实测可用
  8. AD域控exchange邮箱(一)——批量安装MSI安装包
  9. 研究发现,近一半生产容器存在漏洞
  10. OpenDDS 安全配置
  11. MT4本地跟单使用说明
  12. 创意信件风格论文答辩PPT模板
  13. 分布式系统的经典基础理论
  14. spring boot 整合 ip2region(ip地址库)
  15. HDU 613 Kolakoski
  16. linux密码是什么加密方式,Linux系统的几种加密
  17. 做毕设|墨墨背单词+单词本(小程序)01
  18. 估计π的第一种方法:蒲丰(buffon)投针
  19. IllegalArgumentException
  20. 圣诞节计算机老师贺卡祝福语,给老师的圣诞节贺卡祝福语

热门文章

  1. e480换高分屏_ThinkPadE480电脑(i5-8250u 8G内存 256G固态 高分屏0QCD 14英寸) 京东5699元...
  2. 使用HFS+cpolar组合 低成本搭建NAS(1)
  3. linux centos7以上的自带监控界面cockpit案例
  4. 收单外包机构备案业务类型汇总分析
  5. 同时打开多个远程桌面连
  6. android应用开发入门
  7. 1.1Ad Hoc 网络概述
  8. 二进制与或非逻辑计算机,深度学习(1):给感知机做准备,谈谈二进制和与或非门。...
  9. 《A Survey on Transfer Learning》中文版翻译《迁移学习研究综述》
  10. 基于springboot+mybatis+mysql+html企业人事管理系统