我正在使用JPA,jboss 7A ..这是老问题所以我没有显示所有代码和stackTrack Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
这是由我在实体中的代码引起的错误:
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
name="post_rel_component"
, joinColumns={
@JoinColumn(name="post_post_id", nullable=false)
}
, inverseJoinColumns={
@JoinColumn(name="component_component_id", nullable=false)
}
)
private List<Component> components;
//bi-directional many-to-one association to User
@ManyToOne
@JoinColumn(name="post_username", nullable=false)
private User user;
//bi-directional many-to-many association to Tag
@ManyToMany(mappedBy="posts", fetch=FetchType.EAGER)
private List<Tag> tags;
我找到了三种解决方案来解决互联网上的这个问题。我通过将private List<Tag> tags
更改为private Set<Tag> tags
来解决问题。但我真的不明白是什么导致了这个问题。大多数网页都显示了如何修复它,但没有提到导致此问题的原因。你能说明原因吗?
感谢。
答案 0 :(得分:0)
这只是我的猜测..
想象一个SQL结果集,它获取由组件和标签连接的帖子 - 它可能看起来像这样
p.id c.id t.id
1 10 101
1 20 101
1 10 102
1 20 102
阅读:帖子1与两个组件(10&amp; 20)和两个标签(101&amp; 102)相关。
基于此结果集,Hibernate必须组成一个对象图。使用List Hibernate必须首先搜索列表,如果该元素先前已被添加(或者它甚至不打扰这样做,所以你最终得到重复)。所以我猜测性能(也可能是正确性) - 强迫用户使用Set有意义。
可能还有其他复杂的原因我还不知道......
答案 1 :(得分:0)
这是由于Hibernate特定的bug https://hibernate.atlassian.net/browse/HHH-1718在其他JPA提供程序中不存在。只需快速阅读该错误即表明加入两个集合/列表是一个限制,默认情况下,在将集合标记为渴望时会发生这种情况。该错误列出了其他解决方法。