Как предотвратить возникновение исключения org.hibernate.loader.MultipleBagFetchException

Я получаю следующее исключение:

org.hibernate.loader.MultipleBagFetchException: невозможно одновременно получить несколько пакетов

боб, который я использую:

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

}

в дао у меня есть следующий код:

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

Я не знаю, что делать, чтобы предотвратить такое исключение


person Muhammad Bekette    schedule 02.08.2011    source источник
comment
В какой момент в работающем коде возникает исключение?   -  person EkcenierK    schedule 26.08.2011
comment
Ответ можно найти здесь: stackoverflow.com /вопросы/4334970/   -  person    schedule 27.10.2011
comment
Я думаю, вы дали лучший ответ на этот вопрос   -  person Muhammad Bekette    schedule 19.10.2012


Ответы (1)


У меня была аналогичная проблема, и я решил ее, изменив список на набор. Я думаю, что тогда Hibernate не нужно заботиться о ORDER BY (просто угадывая).

person amorfis    schedule 08.12.2011
comment
В качестве альтернативы вы можете сделать @LazyCollection(LazyCollectionOption.FALSE). Мне больше нравится ваш подход, поскольку аннотации согласуются, а используемый тип данных более точно представляет наши данные. - person Christian Bongiorno; 28.09.2012