首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Hibernate @LazyCollection注释的用途是什么

Hibernate @LazyCollection注释的用途是什么
EN

Stack Overflow用户
提问于 2012-10-17 14:29:33
回答 3查看 32.1K关注 0票数 37

我有两个实体作为父实体,子实体作为OneToMany关系作为

代码语言:javascript
复制
@Entity
public class Parent {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String name;

@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
@IndexColumn(name = "index", base = 1)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@LazyCollection(LazyCollectionOption.EXTRA)
private List<Child> childs = new ArrayList<Child>();
// getter and setter

}

那么这里@LazyCollection(LazyCollectionOption.EXTRA)的用法是什么,它什么时候会出现在画面中,比如对子列表的哪个操作,它将是有益的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-17 15:21:46

给你一个提示,这主要是出于性能原因,你可以开始阅读以下链接:

Second Level Cache

Hibernate Documentation

票数 9
EN

Stack Overflow用户

发布于 2013-09-11 18:22:20

额外的= .size()和.contains()不会初始化整个集合

TRUE =首次访问时初始化整个集合

FALSE =紧急加载

票数 44
EN

Stack Overflow用户

发布于 2016-10-19 20:59:01

实际上,没有理由使用@LazyCollection

不需要TRUEFALSE值,因为可以使用FetchType.LAZYFetchType.EAGER获得相同的行为。

JPA值在EXTRA中没有等价物,它是为非常大的集合而设计的。当您第一次访问JPA集合时,该集合并未完全加载,因为任何EXTRA集合通常都是这种情况。

取而代之的是,使用第二个SELECT逐个获取每个元素。这听起来像是一种优化,但这并不是因为EXTRA惰性集合容易出现N+1查询问题。

请注意,这只适用于有序集合,无论是使用@OrderColumn注释的List还是Map。对于包(例如,不保留任何特定顺序的实体的常规List),@LazyCollection(LazyCollectionOption.EXTRA)的行为就像任何其他LAZY集合一样(集合在第一次被访问时被完全获取)。

如果你有一个非常大的集合,那么你根本不应该映射它。相反,您应该只映射JPQL端,并且应该使用分页的@ManyToOne查询,而不是父端集合。

JPQL查询更容易调优,因为您可以应用任何过滤条件,并且可以对结果集进行分页。

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12928402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档