当我们在Hibernate中设置fetch="join"和lazy="true"时会发生什么?

5
如果我们使用“join”作为获取策略,将会触发一次单独的连接查询(通过一个联接查询结合父项和子项),默认行为相当于lazy="false"。这意味着所有子记录将会一次性获取到父级中。但是,如果我们将lazy="true"标记,行为将会如何?由于联接查询是单一的,将会惰性获取什么?
2个回答

10

FetchMode Join覆盖了懒加载属性。它将被简单忽略。 如果您对Fetchmodes需要详细解释感兴趣,请查看此链接。该文章描述了Hibernate fetchmodes以及它们产生的输出。


谢谢解释,但是文章链接无法打开...有替代方案吗? - Gaurav
谢谢你的回答。你的文章也非常好。我已经在推特上分享了你的文章。感谢你用很好的例子帮助理解不同的fetchmodes。 - a3.14_Infinity

0
使用在集合或单值关联映射上的fetch="join",您将通过使用一个“更大”的外连接(对于可空的多对一外键和集合)或内连接(对于非空的多对一外键)SELECT来获取拥有实体和引用实体或集合,从而避免第二个SELECT(因此使关联或集合非延迟加载)。如果您为特定实体实例的多个集合角色(“并行”)使用fetch="join",则会创建笛卡尔积(也称为交叉连接),两个(延迟或非延迟)SELECT可能会更快。

在映射中使用lazy="true",可以启用单个标量值类型属性的延迟加载(这是一种有点奇特的情况)。需要编译持久类的字节码插装以注入拦截代码。可以在HQL中使用FETCH ALL PROPERTIES进行覆盖。

来源:https://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies。希望能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接