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

Posted

技术标签:

【中文标题】如何防止出现 org.hibernate.loader.MultipleBagFetchException【英文标题】:How to prevent having org.hibernate.loader.MultipleBagFetchException 【发布时间】:2011-10-18 02:19:27 【问题描述】:

我得到以下异常:

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() 


在 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);

我不知道如何防止此类异常

【问题讨论】:

在运行代码的哪一点出现异常? 答案可以在这里找到:***.com/questions/4334970/… 我认为你给出了这个问题的最佳答案 【参考方案1】:

我有类似的问题,我通过将列表更改为设置解决了它。我认为 Hibernate 不需要关心 ORDER BY(只是猜测)。

【讨论】:

或者,你可以做 @LazyCollection(LazyCollectionOption.FALSE) 我更喜欢你的方法,因为注释是一致的,并且使用的数据类型更准确地代表了我们的数据

以上是关于如何防止出现 org.hibernate.loader.MultipleBagFetchException的主要内容,如果未能解决你的问题,请参考以下文章

当谷歌的 JS 转换失败时,如何防止材料图标文本出现?

iOS5:如何防止 rectForRowAtIndexPath 方法出现异常

如何防止命令出现在 Bash 历史记录中?

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

如何防止节点出现在面包屑 MVC 中

如何防止 wordpress 插件出现在某些页面上