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

我有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 childs = new ArrayList(); // getter and setter } 

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

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

二级缓存

Hibernate文档

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

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

FALSE =渴望加载

实际上没有理由使用@LazyCollection

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

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

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

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

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

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