问题名称:Hibernate 1+N 问题(N+1问题)
问题概述:在Hibernate 二个或者多个对象有关联(包含之前所述4种关联)的情况,并且设置
fetch = FetchType.EAGER。在执行hql查询语句的时候,查询一个表,将会随便查询出所有相关联的表,
即:发出一条sql语句后,继续发出N条sql语句。
这种问题在多对一关联(最为常见)尤为严重,假如存在user表和group表并且为多对一关联,
user表中有1000条数据,group表中有100条数据。那么这样查询就会产生
1(select user ...)+1000(select group ... where id=XXX)条sql语句,DB将欲哭无泪啊!
解决方案:
1、假如不需要用到关联对象,直接设置fetch = FetchType.LAZY,这样在默认查询的时候就不会多发出N条sql语句了
2、假如用到关联对象,使用sql的左外连接。也就是hql的Left Join Fetch合并为一条sql语句。
图个方便就把session.createQuery(User.class).list();改为session.createCriteria(User.class).list();
因为session.createCriteria()默认使用的是Join Fetch。
详细点改为这样:session.createQuery("from User u left join fetch u.group g").list();
后记:以上的做法可以将查询效率控制在一个可以接受的范围内了,假如对效率要求非常严格的(最好不使用Hibernate),可以采用分布式数据库加缓存查询等来进一步提高效率。
相关推荐
Hibernate的两个类设置了manyToOne之后,在查询的时候, 由于N 对1的一方默认的fetch=FetchType.EAGER,所以会 把被关联的对象一起取出来
NULL 博文链接:https://cdxs2.iteye.com/blog/1936071
HIBERNATE的N+1查询问题 关联查询时
Struts2+hibernate4+layui+mysql简单的网站后台管理系统 项目描述 简单的网站后台管理系统 运行环境 jdk7+tomcat7+mysql+myeclipse ...链接: https://pan.baidu.com/s/1qNkWrWmAk44sh8JHZE1RIw 密码: wt5n
主要介绍了浅谈Hibernate n+1问题,怎么解决n+1问题,文中也作了简要分析,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
hibernate的n+1问题.docx
深入理解hibernate的缓存问题和配置,提高使用hibernate的效率
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
NULL 博文链接:https://samueli.iteye.com/blog/287194
Hibernate1对N案例笔记Hibernate1对N案例笔记Hibernate1对N案例笔记Hibernate1对N案例笔记
properties文件即i18n国际化多国语言版的用法,struts2前台校验,对输入的数据进行验证validators struts2 OGNL 表达式详解 struts2 #,*,%
2 1+N问题 (典型的面试题) (详见 hibernate_2800_Hibernate_1+N项目) 3 list和iterate不同之处(//主要为了面试 详见hibernate_2900_Hibernate_list_iterate) 4 一级缓存和二级缓存和査询缓存(面试题)(详见...
struts2.0+hibernate+spring文档 各种开发中的概念问题
Struts+Hibernate+Javascript 实现人无限级分类树形菜单,从MSSQL读出数据,支持N级,有多少级你就可以添多少级,示例图如上。主要是用到了Struts+Hibernate+JSTL1.1和自定义标签,树形菜单节点用 JavaScript控制...
我的博客中的《Spring MVC、hibernate validator和i18n》文章描述的项目的源代码,该文是对Spring mvc, validation和i18n的一个入门级的tutorial。我的博客地址是http://blog.csdn.net/zjysource
面对复杂的数据处理,我们常常会遇到一对多的问题,而hibernate对此进行了很好的支持
hibernate关系映射系列1,单向1对1映射,意向Nto1 程序说明:生成mysql数据库,建立DB Browser连接后,用户可在程序中自动生成mysql表,非常简单,适合初学者了解hibernate映射机制,有问题可联系flyallen5@hotmail.com
Spring Hibernate查询实用程序Spring应用程序中不再有N + 1个查询Spring Hibernate Query Utils:一种在Spring / Hibernate应用程序中检测N + 1查询并计算查询次数的简便方法·目录用夹具测试检测配置使能够错误等级...
简单的Hibernate的N对N关系的映射,这里主要的只是谈到了关于如何映射一对一,多对一,多对多的单向和双向映射。 当然,其实所谓的单双向映射最终还是要表现在select时的作用,但是这一部分并未介绍。 我想,要想搞...
Hibernate数据关联教程,1对1,多对1,1对多,多对多