Hibernate 获取JPA中的类型

Hibernate 获取JPA中的类型,hibernate,jpa,fetch,Hibernate,Jpa,Fetch,我用的是JPA,JBoss7A。。这是一个老问题,所以我没有显示所有代码和stackTrack,原因是:org.hibernate.loader.MultipleBagFetchException:无法同时提取多个行李 这是由实体中的代码引起的错误: @ManyToMany(fetch=FetchType.EAGER) @JoinTable( name="post_rel_component" , joinColumns={ @Jo

我用的是JPA,JBoss7A。。这是一个老问题,所以我没有显示所有代码和stackTrack
,原因是:org.hibernate.loader.MultipleBagFetchException:无法同时提取多个行李
这是由实体中的代码引起的错误:

@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;
@ManyToMany(fetch=FetchType.EAGER)
@可接合(
name=“post\u rel\u组件”
,连接柱={
@JoinColumn(name=“post\u post\u id”,null=false)
}
,反向连接列={
@JoinColumn(name=“component\u component\u id”,nullable=false)
}
)
私有列表组件;
//对用户的双向多对一关联
@许多酮
@JoinColumn(name=“post\u username”,nullable=false)
私人用户;
//双向多对多关联到标记
@ManyToMany(mappedBy=“posts”,fetch=FetchType.EAGER)
私有列表标签;
我在网上找到了三种解决这个问题的方法。我通过将
私有列表标记
更改为
私有集标记
进行了修复。但我真的不明白是什么导致了这个问题。大多数网页显示了如何修复它,但没有提到是什么导致了这个问题。你能说明原因吗?
谢谢。

这只是我的猜测

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

p.id c.id t.id
1    10   101
1    20   101
1    10   102
1    20   102
阅读:post 1与两个组件(10和20)和两个标签(101和102)相关

基于此结果集,Hibernate必须组成一个对象图。如果元素以前被添加过,那么使用列表Hibernate必须首先搜索列表(或者它甚至不需要这样做,这样您就可以得到重复的列表)。所以,我猜测性能(也许是正确性)明智地迫使用户使用Set是有意义的


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

这是由于Hibernate特有的bug,而这在其他JPA提供程序中是不存在的。只要快速阅读一下这个bug,就会发现连接两个集合/列表是一个限制,默认情况下,将集合标记为“急切”时会出现这种情况。该bug列出了其他解决方法

你的意思是如果我使用Hibernate(在jboss中),我必须接受这个限制吗。我必须通过将列表类型更改为Set类型或其他方式来克服这个限制。