0

我正在使用 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> tagsprivate Set<Tag> tags. 但我真的不明白是什么导致了这个问题。大多数网页都显示了如何修复它,但没有提及导致此问题的原因。你能说明原因吗?谢谢。

4

2 回答 2

0

这只是我的猜测。。

想象一个 SQL 结果集,它获取由组件和标签连接的帖子——它可能看起来像这样

p.id c.id t.id
1    10   101
1    20   101
1    10   102
1    20   102

阅读:帖子 1 与两个组件(10 和 20)和两个标签(101 和 102)相关。

基于这个结果集,Hibernate 必须组成一个对象图。如果之前已经添加了元素,则使用 List Hibernate 必须首先搜索列表(或者它甚至不会打扰这样做,因此您最终会出现重复项)。所以我猜测性能(也许是正确性)强制用户使用 Set 是有道理的。

可能还有其他复杂的原因我还不知道..

于 2013-07-18T14:07:42.963 回答
0

这是由于其他 JPA 提供程序中不存在的Hibernate 特定错误https://hibernate.atlassian.net/browse/HHH-1718 。快速阅读该错误表明它是加入两个集合/列表的限制,当将集合标记为急切时,默认情况下会发生这种情况。该错误列出了其他解决方法。

于 2013-07-18T15:14:12.133 回答