我对“懒惰加载”有一个疑问。
使用@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;
效果很好。
抱歉我的英语 感谢答案 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。 这解决了我的问题。