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

Rah*_*wal 29 java performance orm hibernate lazy-loading

我有2个实体作为父和子作为OneToMany关系

@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

}
Run Code Online (Sandbox Code Playgroud)

那么@LazyCollection(LazyCollectionOption.EXTRA)的使用是什么?什么时候会出现在图片中,比如哪个操作带有子列表,这将是有益的?

wut*_*aer 31

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

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

FALSE =渴望加载


Vla*_*cea 20

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

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

EXTRA值在JPA中没有等效,专为非常大的集合而设计.当您EXTRA第一次访问惰性集合时,集合未完全加载,因为任何JPA集合通常都是如此.

相反,使用辅助元素逐个获取每个元素SELECT.这听起来像是一种优化,但并不是因为EXTRA懒惰的集合容易出现N + 1查询问题.

请注意,这仅适用于List带有@OrderColumnMap(s)注释的有序集合.对于包(例如List,不保留任何特定排序的实体的常规),@LazyCollection( LazyCollectionOption.EXTRA )行为就像任何其他LAZY集合一样(该集合在第一次被访问时完全取出).

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

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

  • 您在这个答案和您的文章中做出假设,集合中的项目将被迭代。情况并非总是如此。我们有几个例子,我们只希望集合上有 `.size()`。使用“@LazyCollection(LazyCollectionOption.EXTRA)”,这是一个简单的“SELECT COUNT(id) FROM...”。如果没有`LazyCollectionOption`,操作就变成:选择所有匹配的行,将它们映射到对象中,然后计算对象的数量。在我运行的简单测试中,对于 50,000 个项目集合,这可能会存在 1 或 2 秒的差异。 (2认同)

Mad*_*ddy 8

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

二级缓存

Hibernate文档