休眠@LazyCollection注释有什么用

2022-09-01 03:38:41

我有2个实体作为父实体和子实体作为一对多关系作为

@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)有什么用处,它什么时候会出现在图片中,比如对于子列表的哪个操作,它将是有益的?


答案 1

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

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

FALSE = 急切加载


答案 2

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

不需要 和 值,因为可以使用 JPA 或 获得相同的行为。TRUEFALSEFetchType.LAZYFetchType.EAGER

该值在 JPA 中没有等效值,并且是为非常大的集合设计的。首次访问惰性集合时,该集合不会完全加载,因为任何 JPA 集合通常都是如此。EXTRAEXTRA

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

请注意,这仅适用于有序集合,可以是用 或 (s) 注释的集合。对于包(例如,不保留任何特定顺序的实体的常规),@LazyCollection(LazyCollectionOption.EXTRA)的行为与任何其他集合一样(集合在首次访问时完全被获取)。List@OrderColumnMapListLAZY

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

JPQL 查询更易于优化,因为您可以应用任何筛选条件,并且可以对结果集进行分页。


推荐