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

2022-09-01 17:44:41

我对“延迟加载”有一个疑问。使用 和 有什么区别?@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;

它完美地工作。

对不起我的英语谢谢


答案 1

注释之间的根本区别在于,它的参数(例如)是纯JPA。它可以与任何JPA提供程序一起使用,例如Hibernate或EclipseLink。@OneToManyfetch = FetchType.EAGER

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

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

至于你真正的问题,可能是你使用的是一个不支持JPA 2.0的Hibernate版本,正如这个答案所暗示的那样?


答案 2

正如这篇文章中提出的:https://stackoverflow.com/a/5865605/5619076 通过集合更改列表应该解决MultiBagFetchException。这解决了我的问题。


推荐