我有两个实体作为父实体,子实体作为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)的用法是什么,它什么时候会出现在画面中,比如对子列表的哪个操作,它将是有益的?
发布于 2012-10-17 15:21:46
发布于 2013-09-11 18:22:20
额外的= .size()和.contains()不会初始化整个集合
TRUE =首次访问时初始化整个集合
FALSE =紧急加载
发布于 2016-10-19 20:59:01
实际上,没有理由使用@LazyCollection
。
不需要TRUE
和FALSE
值,因为可以使用FetchType.LAZY
或FetchType.EAGER
获得相同的行为。
JPA值在EXTRA
中没有等价物,它是为非常大的集合而设计的。当您第一次访问JPA集合时,该集合并未完全加载,因为任何EXTRA
集合通常都是这种情况。
取而代之的是,使用第二个SELECT
逐个获取每个元素。这听起来像是一种优化,但这并不是因为EXTRA
惰性集合容易出现N+1查询问题。
请注意,这只适用于有序集合,无论是使用@OrderColumn
注释的List
还是Map
。对于包(例如,不保留任何特定顺序的实体的常规List
),@LazyCollection(LazyCollectionOption.EXTRA)
的行为就像任何其他LAZY
集合一样(集合在第一次被访问时被完全获取)。
如果你有一个非常大的集合,那么你根本不应该映射它。相反,您应该只映射JPQL端,并且应该使用分页的@ManyToOne
查询,而不是父端集合。
JPQL查询更容易调优,因为您可以应用任何过滤条件,并且可以对结果集进行分页。
https://stackoverflow.com/questions/12928402
复制相似问题