如何防止出现org.hibernate.loader.MultipleBagFetchException

如何防止出现org.hibernate.loader.MultipleBagFetchException,hibernate,hibernate-annotations,Hibernate,Hibernate Annotations,我得到以下例外情况: org.hibernate.loader.MultipleBagFetchException:无法同时提取多个行李 我使用的bean是: @Entity @Table(name="user") public class User implements Serializable { /** * */ private static final long serialVersionUID = -5689970869179555442L; @Id @Column(name

我得到以下例外情况:

org.hibernate.loader.MultipleBagFetchException:无法同时提取多个行李

我使用的bean是:

@Entity
@Table(name="user")
public class User implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = -5689970869179555442L;

@Id
@Column(name="username")
/*@NotNull*/
private String username;

@Column(name="password")
private String password;

@Column(name="email")
/*@Email*/
private String email;

@LazyCollection(LazyCollectionOption.FALSE)
@ManyToMany
@JoinTable(name="user_follower",joinColumns={@JoinColumn(name="username")},
        inverseJoinColumns={@JoinColumn(name="follower")})
private List<User> followers = new ArrayList<User>(0);

/*@LazyCollection(LazyCollectionOption.FALSE)*/
@OneToMany(fetch=FetchType.EAGER)
@JoinTable(name="user_message",joinColumns={@JoinColumn(name="username")},
        inverseJoinColumns={@JoinColumn(name="message_date")})
@OrderBy(value="messageDate")
private List<Message> messages = new ArrayList<Message>(0);

public User() {

}
@实体
@表(name=“user”)
公共类用户实现可序列化{
/**
* 
*/
私有静态最终长serialVersionUID=-5689970869179555442L;
@身份证
@列(name=“username”)
/*@NotNull*/
私有字符串用户名;
@列(name=“password”)
私有字符串密码;
@列(name=“email”)
/*@电子邮件*/
私人字符串电子邮件;
@LazyCollection(LazyCollectionOption.FALSE)
@许多
@JoinTable(name=“user\u follower”,joinColumns={@JoinColumn(name=“username”)},
inverseJoinColumns={@JoinColumn(name=“follower”)}
私有列表关注者=新的ArrayList(0);
/*@LazyCollection(LazyCollectionOption.FALSE)*/
@OneToMany(fetch=FetchType.EAGER)
@JoinTable(name=“user_message”,joinColumns={@JoinColumn(name=“username”)},
inverseJoinColumns={@JoinColumn(name=“message_date”)})
@OrderBy(value=“messageDate”)
私有列表消息=新的ArrayList(0);
公共用户(){
}
在dao中,我有以下代码:

public void followUser(String userToFollow, String username) {
    System.out.println("repository invoked");
    session=sessionFactory.getCurrentSession();
    User user=retrieveUser(username);
    @SuppressWarnings("unchecked")
    List<User> followers=session.createCriteria(User.class).setFetchMode("followers", FetchMode.JOIN)
    .add(Restrictions.eq("username", username)).list();
    for(User follower: followers){
        if(follower.getUsername().equals(userToFollow)){
            //do nothing
        }else{
            followers.add(retrieveUser(userToFollow));
            user.setUserFollowers(followers);
        }
    }
    session.saveOrUpdate(user);
}
public void followUser(字符串userToFollow,字符串username){
System.out.println(“调用存储库”);
session=sessionFactory.getCurrentSession();
用户用户=检索用户(用户名);
@抑制警告(“未选中”)
List followers=session.createCriteria(User.class).setFetchMode(“followers”,FetchMode.JOIN)
.add(Restrictions.eq(“username”,username)).list();
for(用户跟随者:跟随者){
if(follower.getUsername().equals(userToFollow)){
//无所事事
}否则{
添加(retrieveUser(userToFollow));
user.setUserFollowers(followers);
}
}
session.saveOrUpdate(用户);
}

我不知道如何防止这种异常

我遇到了类似的问题,我通过将列表更改为Set来解决它。我认为Hibernate不需要关心排序方式(只是猜测).

在运行代码的哪一点出现异常?答案可以在这里找到:我认为您对该问题给出了最好的答案。或者,您可以使用@LazyCollection(LazyCollectionOption.FALSE)我更喜欢您的方法,尽管注释是一致的,并且使用的数据类型更准确地表示我们的数据