37

我有 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

}

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

4

3 回答 3

44

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

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

FALSE = 急切加载

于 2013-09-11T10:22:20.157 回答
27

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

TRUE不需要和值,FALSE因为可以使用 JPAFetchType.LAZYFetchType.EAGER.

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

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

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

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

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

于 2016-10-19T12:59:01.127 回答
9

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

二级缓存

休眠文档

于 2012-10-17T07:21:45.500 回答