【问题标题】:Does EAGER FetchType populates to its childrenEAGER FetchType 是否填充到其子级
【发布时间】:2021-03-26 05:36:23
【问题描述】:
例如我有以下类结构
class Parent {
fetch = FetchType.EAGER
List<Child> children;
}
class Child {
fetch = FetchType.LAZY
List<SuperChild> superChildren;
}
问题是
当我获取父对象时,例如:
ParentRepository::findById();
superChildren 会因为他们的父母 EAGER 或他们的 LAZY 覆盖而被获取吗?
【问题讨论】:
标签:
java
hibernate
jpa
persistence
【解决方案1】:
FetchType 的文档中没有任何内容暗示与关联实体自己的FetchType 有关的任何行为。请注意LAZY 的描述(这是来自 JPA 规范的文档):
“LAZY 策略是对持久性提供程序运行时的提示,即在首次访问数据时应延迟获取数据。允许实现急切地获取已指定 LAZY 策略提示的数据。”
因此,作为旁注,一般情况下 LAZY 可能无法得到保证,具体取决于实现提供者。
Hibernate(最流行的 JPA 实现)将延迟获取 superChildren,因此 Parent#children 的 FetchType 无关紧要。我没有尝试过其他实现,但我非常怀疑它会有所不同。