Hibernate:在渴望的字段上强制延迟加载

时间:2015-11-27 14:36:36

标签: java hibernate lazy-loading eager-loading

我们的应用程序中的一个模型对象有许多字段配置为如此急切地获取:

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "field")
public Field getField() {
    return this.field;
}

但是我有时候不需要这些信息,这会减慢我的查询。我无法改变行为并使用FetchType.LAZY,因为我不知道会对整个应用程序产生什么影响(遗留...)。有没有办法简单告诉hibernate什么都不提取,除了,如果在查询中指定了?

2 个答案:

答案 0 :(得分:0)

上次我检查了hibernate没有提供适当的解决方案,所以我最终得到了这个解决方案:

  • 将有问题的引用配置为LAZY
  • 所有受影响的服务方法(使用这些模型)都带有boolean forceEager
  • 的重载版本
  • 默认情况下,重构所有现有函数以使用forceEager=true
  • 调用新函数
  • 这就是诀窍:作为“强迫渴望获取”的一种手段,我发现没有什么比实际访问代理(延迟获取)对象更好的了。例如,执行list.size()的延迟引用列表将强制Hibernate加载完整列表,因此服务返回完全获取的对象。

如果对象结构中有多个图层受到影响,则需要遍历整个层次结构并从上到下访问每个延迟加载的对象。

这是一个容易出错的解决方案,所以你需要小心处理它。

答案 1 :(得分:0)

如果可以切换到此查询的Criteria,则可以将FetchMode.SELECT用于字段属性

crit.setFetchMode("field", FetchMode.SELECT);