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

时间:2014-09-23 13:44:58

标签: java hibernate jsf lazy-loading

我对“懒惰加载”有一个疑问。 使用@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;

效果很好。

抱歉我的英语 感谢

3 个答案:

答案 0 :(得分:12)

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

另一方面,

@LazyCollection是特定于Hibernate的,显然只有在使用Hibernate时才有效。

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

至于你的真正问题,可能是你正在使用不支持JPA 2.0的Hibernate版本,this回答建议吗?

答案 1 :(得分:0)

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

尝试所有收藏......

 @Fetch(FetchMode.SUBSELECT)

应该消除错误

答案 2 :(得分:0)

正如本文所述:https://stackoverflow.com/a/5865605/5619076 按Set更改List应解决MultipleBagFetchException。 这解决了我的问题。