我想知道调用方法
PersistenceUnitUtil#isLoaded(Object)
的原因是什么。
JPA Documentation说它可以帮助确定属于持久性单元的实体的加载状态,但它也提到了
如果一个实体的所有属性都已加载,则该实体被视为已加载 FetchType.EAGER已指定已加载。
那么,是否存在并非所有带有
FetchType.EAGER
的属性都被加载的情况?这些是什么?我只确信它适用于 EntityManager#getReference()
方法返回的实体。还有更多吗?
它的一大用途是集成测试。如果你想确保当调用某个方法时,无论返回的是什么都加载了某些东西,这是一个很好的方法。
设置为使用
FetchType.EAGER
的关系可能会通过多种方式导致未加载。
使用
@NamedEntityGraph
时,如果将查询的提示指定为 javax.persistence.fetchgraph
,则 JPA 提供程序应该仅加载实体图中指定的关系。这就是它和 javax.persistence.loadgraph
之间的区别,后者使用实体图中已有的任何获取类型加载未在实体图中指定的关系。
问题以及我说提供程序“应该”仅加载这些关系的原因是,JPA 规范允许提供程序始终加载超出规范要求的内容。具体来说,Hibernate 会忽略 fetchgraph 的推荐行为,并将其视为与 loadgraph 相同。
对于 Hibernate 标准查询,您可以使用
setFetchMode()
显式覆盖和设置任何关系的获取模式。我不知道其他提供商。
也许还有其他人?
啊,当我四处寻找更多细节时,我发现这已经在另一个 StackOverflow 问题中说了:
在单元测试上下文中要小心,使用
isLoaded
方法检查 EntityGraph
是否已加载另一个实体。如果实体为空,它将返回“true”。
我遇到了这个问题,只发现这个问题谈论这个方法,所以它可以帮助其他人。
顺便说一句,在测试我们的EntityGraphes是否在
@NamedEntityGraph
注释中写得很好时,MorganP强调了我们此方法的主要用法👍