hibernate 得1+n问题

原创 2013年12月03日 11:23:56
【问题】什么时候会遇到N+1的问题?

【备注】 Hibernate默认抓取策略是fetch="select",不是fetch="join",这都是为了延迟加载而准备的。

【出现情况】
         1)一对多(one-to-many) ,在1的这方,通过1条sql查找得到了1个对象,由于关联的存在 ,那么又需要将这个对象关联的集合取出,所以合集数量是n还要发出n条sql,于是本来的1条sql查询变成了    1 +n条 。
         2)多对一<many-to-one>  ,在多的这方,通过1条sql查询得到了n个对象,由于关联的存在,也会将这n个对象对应的1 方的对象取出, 于是本来的1条sql查询变成了1 +n条 。


         3)iterator 查询时,一定先去缓存中找(1条sql查集合,只查出ID),在没命中时,会再按ID到库中逐一查找, 产生1+n条SQL。




【解决办法】

          1)lazy=true, hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作。


          2)使用二级缓存, 二级缓存的应用将不怕1+N 问题,因为即使第一次查询很慢(未命中),以后查询直接缓存命中也是很快的。刚好又利用了1+N 。


          3 ) 当然你也可以设定fetch="join",一次关联表全查出来,但失去了延迟加载的特性。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

hibernate的n+1问题.docx

  • 2012-06-05 12:32
  • 28KB
  • 下载

hibernate中的N+1问题

什么时候会遇到1+N的问题?  前提:Hibernate默认表与表的关联方法是fetch="select",不是fetch="join",这都是为了懒加载而准备的。    1)一对多() ...

Hibernate 查询1+N问题详解

1、1+N简单来说就是,Person和Phone是一对多关系,现在我看看所有手机的信息,对于其属于哪个人不感兴趣,但把lazy设为false(lazy=false),这样就会发出1(查询手机的sql)...

hibernate N+1查询问题

在Session的缓存中存放的是相互关联的对象图。默认情况下,当Hibernate从数据库中加载Customer对象时,会同时加载所有关联的Order对象。以Customer和Order类为例,假定O...

Hibernate学习_018_1+N问题

preparing...

Hibernate表中的1+N的问题

1、所谓1+N的问题,意思是说我们希望查询一张表里面的数据,但是在执行sql语句时,会发生多条和另外对应表的sql语句。这样会降低数据库执行效率和性能。 2.解决1+N的问题的三种方式如下: /...

hibernate中的1+N问题

Hibernate n+1问题  在Session的缓存中存放的是相互关联的对象图。默认情况下,当Hibernate从数据库中加载Customer对象时,会同时加载所有关联的 Order对象。以Cus...

Hibernate中1+N问题以及解决方法

1. Hibernate中的1+N问题描述           在多对一关系中,当我们需要查询多的一方对应的表的记录时,可以用一条sql语句就能完成操作。然而,在多的一方的实体类中的@Many...

Hibernate n+1问题

发现这篇文章,讲n+1问题,讲得简洁易懂,故转载之。 n+1问题,貌似大家都懂,但是如何发现,如何避免是关键。 在Session的缓存中存放的是相互关联的对象图。默认情况下,当Hibe...

Hibernate的n+1问题

1、在利用Hibernate操作数据库的时候,如果在实体类上设置了表的双向关联.这可能会出现Hibernate N+1的问题.         1.1、一对多:              ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)