Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate@LazyCollection注释的用途是什么_Java_Performance_Hibernate_Orm_Lazy Loading - Fatal编程技术网

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

Java Hibernate@LazyCollection注释的用途是什么,java,performance,hibernate,orm,lazy-loading,Java,Performance,Hibernate,Orm,Lazy Loading,我有两个实体作为父母,孩子作为一对夫妻关系 @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) @Cascad

我有两个实体作为父母,孩子作为一对夫妻关系

@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

}
@实体
公共类父类{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有整数id;
私有字符串名称;
@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();
//接二连三
}

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

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


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

TRUE=第一次访问时初始化整个集合


FALSE=急切加载

实际上没有理由使用
@LazyCollection

不需要
TRUE
FALSE
值,因为JPA
FetchType.LAZY
FetchType.EAGER
可以获得相同的行为

EXTRA
值在JPA中没有等效值,是为非常大的集合而设计的。当您第一次访问一个
EXTRA
lazy集合时,该集合并没有完全加载,就像任何JPA集合一样

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

请注意,这仅适用于使用
@OrderColumn
注释的
列表
(s)或
映射
(s)的有序集合。对于行李(例如,不保留任何特定顺序的实体的常规
列表
),其行为与任何其他
惰性
收集一样(收集完全在第一次访问时获取)

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


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

获取(0)
初始化整个集合?@LakshayGargyes@LakshayGarg,这取决于您使用的选项,EXTRA不会初始化整个集合,但会为此特定元素执行查询。但是,如果您改为使用附加到此集合的迭代器(如in-stream或in-for-each循环),它将初始化它。TRUE-将始终初始化整个集合。我可以问一下什么是非常大的集合吗?非常大的集合是一个需要花费大量时间才能从数据库中获取的集合。您在这个答案和您的文章中假设集合中的项将被迭代。事实并非总是如此。我们有两个示例,其中我们只想在集合中使用
.size()
。使用
@LazyCollection(LazyCollectionOption.EXTRA)
这是一个简单的
从..
中选择计数(id)。如果没有
LazyCollectionOption
,操作将变成:选择所有匹配的行,将它们映射到对象中,然后计算对象的数量。在我运行的简单测试中,对于50000项集合,这可能是1秒或2秒的差异。您假设映射集合是一项职责。只有当集合的大小相当小时,它们才值得映射。对大型集合使用查询,以便可以对集合进行分页。对于集合大小,只需使用计数查询。它就像一个符咒一样工作。@Vladmichalcea所以你的论点可以归结为“这个功能很糟糕,因为有人可能会错误地使用它并遇到性能问题”。我认为这不是评估一个特性有用性的一个很好的标准,并且建议你在Hibernate(还有许多其他的库(和java和其他语言))中有许多特征,它们有相同的缺陷(如果你认为这样的属性是一个缺陷)。