Hibernate N+1 问题及解决办法
问题出现的原因:
Hibernate 中常会用到 set , bag 等集合表示 1 对多的关系,在获取实体的时候就能根据关系将关联的对象或者对象集取出,还可以设定 cacade 进行关联更新和删除。这不得不说 hibernate 的 orm 做得很好,很贴近 oo 的使用习惯了。
但是对数据库访问还是必须考虑性能问题的,在设定了 1 对多这种关系之后, 查询就会出现传说中的 n+1 问题。
一对多: 在一方,查找得到了 n 个对象,那么又需要将 n 个对象关联的集合取出,于是本来的一条 sql 查询变成了 n+1 条;
多对一: 在多方,查询得到了 m 个对象,那么也会将 m 个对象对应的 1 方的对象取出, 也变成了 m+1 ;
解决问题的方法:
1、 使用 fetch 抓取, Hibernate 抓取策略分为单端代理和集合代理的抓取策略。
Hibernate 抓取策略 ( 单端代理的抓取策略 ) :
保持默认也就是如下 :
<many-to-one name="clazz" cascade="save-update" fetch="select" />
fetch="select" 就是另外发送一条 select 语句抓取当前对象关联实体或者集合设置 fetch="join"
<many-to-one name="clazz" cascade="save-update" fetch="join"/>
Hibernate 会通过 select 语句使用外连接来加载器关联实体活集合此时 lazy 会失效
Hibernate 抓取策略 ( 集合代理的抓取策略 ) :
保持默认( fetch="select" )也就是如下 :
<set name="students" inverse="true">
<key column="clazz"/>
<one-to-many class="com.june.hibernate.Student"/>
</set>
1)fetch="select" 会另外发出一条语句查询集合
2) 设置 fetch="join" 采用外连接集合的 lazy 失效
3) 这只 fetch="subselect" 另外发出一条 select 语句抓取前面查询到的所有的实体对象的关联集合 fetch 只对 HQL 查询产生影响其他的则不会
2、 使用 map 直接搜索需要的列
如:产品 product 和产品分类 product_category 两张表,多对一关系。查询产品列表时
select new Map(p.id as id, p.name as name, p.category.name as categoryName) from Product p
分享到:
相关推荐
NULL 博文链接:https://cdxs2.iteye.com/blog/1936071
主要介绍了浅谈Hibernate n+1问题,怎么解决n+1问题,文中也作了简要分析,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
HIBERNATE的N+1查询问题 关联查询时
hibernate的n+1问题.docx
深入理解hibernate的缓存问题和配置,提高使用hibernate的效率
Struts2+hibernate4+layui+mysql简单的网站后台管理系统 项目描述 简单的网站后台管理系统 运行环境 jdk7+tomcat7+mysql+myeclipse ...链接: https://pan.baidu.com/s/1qNkWrWmAk44sh8JHZE1RIw 密码: wt5n
Hibernate的两个类设置了manyToOne之后,在查询的时候, 由于N 对1的一方默认的fetch=FetchType.EAGER,所以会 把被关联的对象一起取出来
NULL 博文链接:https://samueli.iteye.com/blog/287194
Spring Hibernate查询实用程序Spring应用程序中不再有N + 1个查询Spring Hibernate Query Utils:一种在Spring / Hibernate应用程序中检测N + 1查询并计算查询次数的简便方法·目录用夹具测试检测配置使能够错误等级...
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
简介 在orm框架中,比如hibernate和mybatis都可以设置关联对象,比如user对象关联dept ...dept,是n次,所以是n+1问题,其实叫1+n更为合理一些。 mybatis配置 UserMapper.xml <result column
更具体地说,它被设计为一种非常轻量级的解决方案,用于解决聚合数据时的N + 1查询问题,这些问题不仅来自数据库调用(例如Spring Data JPA,Hibernate),而且来自任意数据源(关系数据库,NoSQL,REST,本地方法...
用于在基于JPA的Spring Boot Java应用程序中自动检测和断言“N+1选择问题”发生的工具,并在一般情况下发现JPA发出的SQL语句的来源- adgadev/jplusone-源码
1. Spring框架:Spring是一个轻量级的Java开发框架,提供了丰富的功能和模块,用于开发企业级应用。它包括IoC(Inverse of Control,控制反转)容器、AOP(Aspect-Oriented Programming,面向切面编程)等特性,可以...
框架的美!让我们集成框架吧! import static java.lang.System.*; //静态导入 ...Integer i=1; //自动封箱 for(String s:args){ out.printf(”%d: %s %n”,i,s); //格式化输出,自动解箱 i++ } } }
2 1+N问题 (典型的面试题) (详见 hibernate_2800_Hibernate_1+N项目) 3 list和iterate不同之处(//主要为了面试 详见hibernate_2900_Hibernate_list_iterate) 4 一级缓存和二级缓存和査询缓存(面试题)(详见...
Flex+Gilead+BlazeDS+Spring+Hibernate示例Demo,使用1:n和m:n两个双向关系,很好的演示了Gilead的Hibernate Lazy Killer特性,借助Gilead可以有效规避DTO模式的大量繁琐代码。效果图展示地址:...
1.STRUTS2乱码,解决方法是在struts.xml中加入 <constant name="struts.i18n.encoding" value="gb2312" /> 2.验证失败一次后就连续验证失败 (即使密码正确) 这个属于与Spring整合的问题,Spring容器在初始化对象的...
hibernate缓存详解,比如什么时候会遇到N+1的问题?怎么解决
想象一下,有一个工具可以自动检测您是否正确使用了JPA和Hibernate。 不再有性能问题,也不必花费大量时间试图弄清为什么您的应用程序几乎无法爬网。 想象一下在开发周期的早期发现您正在使用次优的映射和实体关系...