【问题标题】:How to prevent Hibernate load the whole collection?如何防止 Hibernate 加载整个集合?
【发布时间】:2014-04-24 09:24:28
【问题描述】:

例如,我有以下实体:

class User{
    ...
    private Set questions;
    ...
}

当我操作领域模型时:

  user.questions.add(...);

Hibernate 将加载此集合的所有问题,即使我将集合设置为 LAZY。我该如何改变这种行为?

【问题讨论】:

    标签: java hibernate lazy-loading


    【解决方案1】:

    您必须使用注释集合

    @LazyCollection(LazyCollectionOption.EXTRA)
    

    【讨论】:

      【解决方案2】:

      TL;DR

      不要这样做,根据请求加载所有集合。

      详情

      我认为您应该重新考虑避免在通过add() 方法调用更新集合元素时避免加载集合的愿望。以下是我的论点:

      • 添加元素时,结果(即是否添加元素)可能取决于集合的类型。对于Set - 它绝对取决于集合内容。

      • 在业务逻辑方面,你的Set代表了一些与用户相关的问题。假设您达到了您想要的结果 - 前五个问题在集合中,其余十个不在集合中。那么收藏的商业意义是什么?听起来很可疑。

      如果您认为我的论点不好,请随意使用其他答案中描述的技术。

      【讨论】:

        【解决方案3】:

        所以实际问题描述:当我应用级联时,会出现性能问题,因为可能会有很多问题。

        我的回答是:那么不要使用级联来保存问题,使用常规的 EntityManager.persist() 调用来保留问题。

        很明显,对吧?

        【讨论】:

          【解决方案4】:

          如果结果集大小非常大,您可以通过设置最大限制来分批完成

          query.setMaxResults(int maxResults)
          

          【讨论】:

          • 这不是限制xxx-to-xxx-mapped 集合中结果数量的方法。这是限制查询检索到的实体数量的方法。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-29
          • 2020-06-14
          • 1970-01-01
          • 2016-12-21
          • 1970-01-01
          相关资源
          最近更新 更多