在JPA中获取类型

时间:2013-07-18 13:33:47

标签: hibernate jpa fetch

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

2 个答案:

答案 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提供程序中不存在。只需快速阅读该错误即表明加入两个集合/列表是一个限制,默认情况下,在将集合标记为渴望时会发生这种情况。该错误列出了其他解决方法。