【问题标题】:Hibernate : Force lazy-loadding on eager fieldHibernate:强制延迟加载和急切字段
【发布时间】:2015-11-27 14:36:36
【问题描述】:

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

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

但是我有时不需要这些信息,这会毫无意义地减慢我的查询速度。我无法更改行为并改用FetchType.LAZY,因为我不知道会对整个应用程序产生什么影响(遗留......)。有没有办法简单地告诉hibernate 不获取任何内容,except 如果它在查询中指定?

【问题讨论】:

  • 你使用的是 hql 还是标准?
  • HQL 主要是(命名查询),但如果需要,我可以切换到条件。

标签: java hibernate lazy-loading eager-loading


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回复。我试过了,但没有任何改变,我仍然有很多 SELECT 查询。我认为我唯一的解决方案是将其保留或将所有内容更改为 LAZY 并更正所有损坏的代码...
    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 2017-06-03
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多