我对“延迟加载”有一个疑问。
@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;
它工作完美。
对不起我的英语 谢谢
注释之间的根本区别在于
@OneToMany
及其参数(例如fetch = FetchType.EAGER
)是纯JPA。它可以与任何 JPA 提供程序一起使用,例如 Hibernate 或 EclipseLink。
@LazyCollection
另一方面,它是 Hibernate 特有的,显然只有在使用 Hibernate 时才有效。
如果可能的话,尽量遵守JPA规范。通过这样做,您应该能够轻松地切换提供商(至少在理论上)。
至于您真正的问题,可能是您使用的 Hibernate 版本不支持 JPA 2.0,如 this 答案所示?
正如本文中所建议的:https://stackoverflow.com/a/5865605/5619076 按集合更改列表应该可以解决 MultipleBagFetchException。 这解决了我的问题。
我想我也遇到了同样的问题...
尝试所有系列...
@Fetch(FetchMode.SUBSELECT)
它应该消除错误
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)
所以,在作者的具体情况下,确实没有区别。