@LazyCollection(LazyCollectionOption.FALSE) 和 @OneToMany(fetch = FetchType.EAGER) 之间的区别

问题描述 投票:0回答:4

我对“延迟加载”有一个疑问。

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(fetch = FetchType.EAGER)
的使用有什么区别?

在我的应用程序中,我使用两个列表,但如果我使用这种格式:

@OneToMany(mappedBy = "consultaSQL", orphanRemoval = true, fetch = FetchType.EAGER,
        cascade = CascadeType.ALL)
private List<ParametroSQL> parametros;


@OneToMany(mappedBy = "consulta", orphanRemoval = true, fetch = FetchType.EAGER,
        cascade = CascadeType.ALL)
private List<Contato> contatos;

我有这个错误:

原因:org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包

我知道发生这种情况是因为 Hibernate 不允许我同时加载两个列表。但如果我使用这种格式:

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "consultaSQL", orphanRemoval = true,
        cascade = CascadeType.ALL)
private List<ParametroSQL> parametros;

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "consulta", orphanRemoval = true,
        cascade = CascadeType.ALL)
private List<Contato> contatos;

它工作完美。

对不起我的英语 谢谢

java hibernate jsf lazy-loading
4个回答
26
投票

注释之间的根本区别在于

@OneToMany
及其参数(例如
fetch = FetchType.EAGER
)是纯JPA。它可以与任何 JPA 提供程序一起使用,例如 Hibernate 或 EclipseLink。

@LazyCollection
另一方面,它是 Hibernate 特有的,显然只有在使用 Hibernate 时才有效。

如果可能的话,尽量遵守JPA规范。通过这样做,您应该能够轻松地切换提供商(至少在理论上)。

至于您真正的问题,可能是您使用的 Hibernate 版本不支持 JPA 2.0,如 this 答案所示?


1
投票

正如本文中所建议的:https://stackoverflow.com/a/5865605/5619076 按集合更改列表应该可以解决 MultipleBagFetchException。 这解决了我的问题。


0
投票

我想我也遇到了同样的问题...

尝试所有系列...

 @Fetch(FetchMode.SUBSELECT)

它应该消除错误


0
投票

hibernate 文档有一个专门的部分对此进行了解释。长话短说 - 从功能角度来看,这些注释是相同的(尽管有报告表明情况并非如此),或者至少这是它的本意。

Hibernate 为此创建自己的注释的原因尚未指定,但根据我的经验,框架倾向于为某些问题创建注释/解决方案,这些问题不依赖于单独的规范(本例中为 JPA)或库(仅仅因为他们无法控制库的代码),所以我猜 Hibernate 只是想在这里更加灵活,以防它想要在延迟加载功能中添加任何内容。

万一链接失效,Hibernate 文档中有一个等效表(表 2.3):

Annotations                             Lazy                    Fetch
@[One|Many]ToOne](fetch=FetchType.LAZY)  @LazyToOne(PROXY)      @Fetch(SELECT)
@[One|Many]ToOne](fetch=FetchType.EAGER) @LazyToOne(FALSE)      @Fetch(JOIN)
@ManyTo[One|Many](fetch=FetchType.LAZY)  @LazyCollection(TRUE)  @Fetch(SELECT)
@ManyTo[One|Many](fetch=FetchType.EAGER) @LazyCollection(FALSE) @Fetch(JOIN)

所以,在作者的具体情况下,确实没有区别。

© www.soinside.com 2019 - 2024. All rights reserved.