Hibernate 1+N 问题

问题名称: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),可以采用分布式数据库加缓存查询等来进一步提高效率。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值