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

Java Hibernate:强制在渴望字段上延迟加载,java,hibernate,lazy-loading,eager-loading,Java,Hibernate,Lazy Loading,Eager Loading,应用程序中的一个模型对象具有许多字段,这些字段被配置为急切地获取,如下所示: @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "field") public Field getField() { return this.field; } 然而,我有时不需要这些信息,这会无缘无故地减慢我的查询速度。我无法更改行为并改用FetchType.LAZY,因为我不知道这会对整个应用程序(遗留…)产生什么影响。有没有一种方法可以简单地告

应用程序中的一个模型对象具有许多字段,这些字段被配置为急切地获取,如下所示:

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

然而,我有时不需要这些信息,这会无缘无故地减慢我的查询速度。我无法更改行为并改用
FetchType.LAZY
,因为我不知道这会对整个应用程序(遗留…)产生什么影响。有没有一种方法可以简单地告诉
hibernate
什么也不取,除非在查询中指定了它

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

  • 将有问题的引用配置为
    LAZY
  • 所有受影响的服务方法(使用这些模型)都得到了一个重载版本,版本为
    boolean forceEager
  • 默认情况下,对所有现有函数进行重构,以调用具有
    forceEager=true
  • 诀窍就在这里:作为“强制急切抓取”的一种手段,我发现没有什么比实际访问代理(延迟抓取)对象更好的了。例如,一个延迟引用的列表执行
    list.size()
    将强制Hibernate加载完整的列表,因此服务返回完全获取的对象
如果objectstructure中有多个层受到影响,则需要遍历整个层次结构,并从上到下访问每个延迟加载的对象


这是一个容易出错的解决方案,因此您需要小心处理。

上次我检查hibernate没有提供合适的解决方案,因此我最终使用了此解决方案:

  • 将有问题的引用配置为
    LAZY
  • 所有受影响的服务方法(使用这些模型)都得到了一个重载版本,版本为
    boolean forceEager
  • 默认情况下,对所有现有函数进行重构,以调用具有
    forceEager=true
  • 诀窍就在这里:作为“强制急切抓取”的一种手段,我发现没有什么比实际访问代理(延迟抓取)对象更好的了。例如,一个延迟引用的列表执行
    list.size()
    将强制Hibernate加载完整的列表,因此服务返回完全获取的对象
如果objectstructure中有多个层受到影响,则需要遍历整个层次结构,并从上到下访问每个延迟加载的对象


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

如果可以切换到此查询的条件,可以使用FetchMode.SELECT作为字段属性

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

如果可以切换到此查询的条件,则可以使用FetchMode.SELECT作为字段属性

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

您是否使用hql或条件?hql主要是(命名查询),但如果需要,我可以切换到条件。您是否使用hql或条件?hql主要是(命名查询),但如果需要,我可以切换到条件。谢谢您的回复。我试过了,但是没有任何改变,我仍然有很多SELECT查询。我想我唯一的解决办法就是让它保持原样,或者把所有的东西都改成懒惰的,并纠正所有的错误代码…谢谢你回复。我试过了,但是没有任何改变,我仍然有很多SELECT查询。我想我唯一的解决办法就是让它保持原样,或者把所有的东西都改成懒惰的,并纠正所有坏掉的代码。。。