【问题标题】:How can I set Hibernate FetchType not to Eager or Lazy but to "none" so that it does NOT load the stuff itself?如何将 Hibernate FetchType 设置为不急切或懒惰,而是设置为“无”,这样它就不会加载内容本身?
【发布时间】:2020-02-12 19:42:28
【问题描述】:

我有一个具有如下字段的 Hibernate 类:

@OneToMany(
    orphanRemoval = true,
    mappedBy = "others",
    cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
private Set<AnotherEntity> otherEntities;

我们开启了延迟加载,因此它不会一次加载所有内容。 但我想拥有它,这样它就根本不加载这些东西——如果我想加载它,我将使用一个(Hibernate)查询来获取所有必要的信息。 如果我只加载主要对象,则不应加载任何其他对象。

entity.getOtherEntities() 应该返回 null - 即使有数据。

有没有办法做到这一点?

【问题讨论】:

  • 我的理解是,如果您尝试通过某种 getter 访问它,延迟加载只会加载引用的集合。那么这种行为有什么问题呢?只需在您想使用时访问其他实体集合,Hibernate 将不会加载任何内容。
  • 我想在存储库中定义应该获取哪些数据。如果我说我不想要其他实体,那么它们应该为空。我想要这个,因为我使用转换器将所有这些东西转换为其他对象 - 如果数据在那里。这些转换器将(通过延迟加载)加载越来越多的数据。我想在实体方面有限制,让我的转换器转换他们获得的所有数据。

标签: java hibernate jpa jpql hibernate-mapping


【解决方案1】:

有几个示例性的选项:

  1. 您可以使用投影(一个带有 getter 和 setter 的接口,用于您需要获取的字段)。 Here 一个例子。
  2. 您可以将字段提取到超类(使用MappedSuperclass)并使用它仅获取必要的数据。
  3. 使用EntityManager.createQuery,您可以使用 jpql 指定字段,然后只会获取声明的字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多