如何防止Hibernate加载整个集合?

时间:2014-04-24 09:24:28

标签: java hibernate lazy-loading

例如,我有以下实体:

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

当我操作域模型时:

  user.questions.add(...);
即使我将集合设置为Hibernate

LAZY也会加载此集合的所有问题。我该如何改变这种行为?

4 个答案:

答案 0 :(得分:1)

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

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

非常明显,对吧?

答案 1 :(得分:0)

您必须使用

注释该集合
@LazyCollection(LazyCollectionOption.EXTRA)

答案 2 :(得分:0)

<强> TL; DR

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

<强>详情

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

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

  • 就业务逻辑而言,您的Set代表了一些与用户相关的问题。让我们假设你达到了你想要的结果 - 前五个问题在集合中,其余十个不在。那么该系列的商业含义是什么?听起来真的很可疑。

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

答案 3 :(得分:-1)

如果resultSet大小非常大,您可以通过设置最大限制

批量执行此操作
query.setMaxResults(int maxResults)