为什么要使用FetchType.LAZY和FetchMode.JOIN而不是FetchType.EAGER?

时间:2013-04-23 19:02:25

标签: hibernate

为什么要将FetchType.LAZYFetchMode.JOIN而不是FetchType.EAGER一起使用?FetchType.LAZYFetchMode.JOIN等同于Eager模式。这样对吗?。为什么放Fetchmode.join表示如果发生任何延迟异常,我们可以添加fetchmode=join?为什么不能直接使用fetchtype.Eager。那么使用fetchtype和fetchmode.join()是否有任何好处?。

4 个答案:

答案 0 :(得分:1)

使用小型结果集数据模型, FetchType.EAGER 不会对 FetchMode.JOIN 对延迟和内存占用产生很大影响。

对于需要最佳效率的高容量数据集模型,取决于技术和环境因素, FetchType.LAZY 更理想,因为连接表指针保持不变 - 但实际结果集保持不变需求。

例如:在效率和资源利用方面,与数据集密钥紧密结合的住宅对象与热切联接电话号码对象的区域代码对象累积不同。

必要时:

  • 使用 FetchType.EAGER 进行小型结果集连接。
  • 并使用 FetchType.LAZY 进行大型结果联接,效率被视为必不可少。

答案 1 :(得分:0)

对于集合或单值关联映射使用fetch =“join”,您实际上将避免第二个SELECT(因此使关联或集合非惰性)

参考

https://developer.jboss.org/wiki/AShortPrimerOnFetchingStrategies

答案 2 :(得分:0)

FetchType更适合在实体注释中使用。大多数时候我会建议你使用lazy加载。

在这种情况下,如果您需要阻止LazyIntializationException,则可以使用eager即时邀请标准加载为FetchMode.JOIN

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .setFetchMode("mate", FetchMode.JOIN)
    .setFetchMode("kittens", FetchMode.JOIN)
    .list();

答案 3 :(得分:-1)

考虑具有工资睡眠列表(一个连接)的类Employee。 1 EMployee已经说过超过100个工资睡眠。

您希望拥有所有员工的名单(比如1000)。 假设我们只想显示员工信息(无工资睡眠)。 但是当我们用Eager模式加载它时,即使所有员工都加载了所有工资睡眠。这是内存的开销。