【问题标题】:HIbernate and eager loading of collections休眠和急切加载集合
【发布时间】:2011-04-29 12:16:33
【问题描述】:

A 类和B 类之间存在一对多关系,由数据库中两个表之间的外键关系表示。我希望 hibernate 急切地加载 Bs 的集合,以便可以在会话之外遍历它。

所以我在一对多和多对一映射条目上都指定了lazy="false"

B.hbm

<many-to-one cascade="all" fetch="join" lazy="false"
   class="A" name="...">
   <column name="adgroup_id"/>
  </many-to-one>

A.hbm

<list cascade="all" inverse="true" name="..." lazy="false" fetch="join">
      <key column="adgroup_id" />
       <one-to-many class="B"  />
</list>

我注意到hibernate执行的sql确实返回了预期的行数,但是当我调用时

A.getBs(),我得到的元素太多了。事实上,由于我在数据库中的 id 是自动分配的,它似乎返回了 n+1 个元素,其中 n 是 Bs 表中当前最高的 id。

这里发生了什么?

顺便说一句,我正在使用 Spring hibernate 模板,调用 template.get(class,id) 以返回 A

【问题讨论】:

    标签: hibernate hibernate-mapping


    【解决方案1】:

    很好地描述了n+1问题:What is SELECT N+1?

    【讨论】:

    • 对不起,我看不到你的回答有什么用处。这里只执行一次选择,返回预期的行数。但是,Java中返回的集合中的条目数我得到了太多的元素
    猜你喜欢
    • 2023-03-24
    • 2021-02-17
    • 2014-08-08
    • 2023-04-06
    • 2012-09-16
    • 1970-01-01
    • 2010-11-24
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多