【问题标题】:Usage of isLoaded(Object) method in PersistenceUnitUtilPersistenceUnitUtil 中 isLoaded(Object) 方法的使用
【发布时间】:2014-09-15 04:18:09
【问题描述】:

我想知道调用方法PersistenceUnitUtil#isLoaded(Object)的原因是什么。

JPA Documentation 说它可以帮助确定属于持久性单元的实体的负载状态,但它也提到了

一个实体被认为是加载的,如果它的所有属性 已指定 FetchType.EAGER 已加载。

那么,有没有FetchType.EAGER 的所有属性都没有被加载的情况?这些是什么?我只确定它适用于EntityManager#getReference() 方法返回的实体。还有更多吗?

【问题讨论】:

  • 我想它可能在多线程环境的某些边缘情况下很有用。
  • 我一直认为它是为了补充 getReference 与 find 方法的使用。 getReference 允许返回只有 pk 集的未获取实体。 isLoaded 会告诉你实体是否已经被获取。

标签: java hibernate jpa eclipselink jpa-2.0


【解决方案1】:

它的一大用途是集成测试。如果您想确保在调用某个方法时,无论返回什么都加载了某些内容,这是一个很好的方法。

设置为使用FetchType.EAGER 的关系有多种方式最终无法加载。

  1. 使用@NamedEntityGraph 时,如果将查询的提示指定为javax.persistence.fetchgraph,则JPA 提供程序应仅加载实体图中命名的关系。这就是 javax.persistence.loadgraphjavax.persistence.loadgraph 之间的区别,后者使用它们已有的任何获取类型加载实体图中未指定的关系。

    问题,以及我说提供者“应该”只加载这些关系的原因是,JPA 规范允许提供者总是加载超出规范要求的内容。具体来说,Hibernate 会忽略 fetchgraph 的推荐行为,并将其视为 loadgraph。

  2. 对于 Hibernate 条件查询,您可以使用 setFetchMode() 显式覆盖和设置任何关系的获取模式。我不知道其他提供商。

也许还有其他人?

啊,当我四处寻找更多细节时,我发现这已经在另一个 StackOverflow 问题中说了:

Ignore a FetchType.EAGER in a relationship

【讨论】:

    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    相关资源
    最近更新 更多