【发布时间】:2014-04-24 09:24:28
【问题描述】:
例如,我有以下实体:
class User{
...
private Set questions;
...
}
当我操作领域模型时:
user.questions.add(...);
Hibernate 将加载此集合的所有问题,即使我将集合设置为 LAZY。我该如何改变这种行为?
【问题讨论】:
标签: java hibernate lazy-loading
例如,我有以下实体:
class User{
...
private Set questions;
...
}
当我操作领域模型时:
user.questions.add(...);
Hibernate 将加载此集合的所有问题,即使我将集合设置为 LAZY。我该如何改变这种行为?
【问题讨论】:
标签: java hibernate lazy-loading
您必须使用注释集合
@LazyCollection(LazyCollectionOption.EXTRA)
【讨论】:
TL;DR
不要这样做,根据请求加载所有集合。
详情
我认为您应该重新考虑避免在通过add() 方法调用更新集合元素时避免加载集合的愿望。以下是我的论点:
添加元素时,结果(即是否添加元素)可能取决于集合的类型。对于Set - 它绝对取决于集合内容。
在业务逻辑方面,你的Set代表了一些与用户相关的问题。假设您达到了您想要的结果 - 前五个问题在集合中,其余十个不在集合中。那么收藏的商业意义是什么?听起来很可疑。
如果您认为我的论点不好,请随意使用其他答案中描述的技术。
【讨论】:
所以实际问题描述:当我应用级联时,会出现性能问题,因为可能会有很多问题。
我的回答是:那么不要使用级联来保存问题,使用常规的 EntityManager.persist() 调用来保留问题。
很明显,对吧?
【讨论】:
如果结果集大小非常大,您可以通过设置最大限制来分批完成
query.setMaxResults(int maxResults)
【讨论】:
xxx-to-xxx-mapped 集合中结果数量的方法。这是限制查询检索到的实体数量的方法。