Foo выглядит так:
@ManyToMany
private Set<User> favouritedBy;
в то время как у пользователя есть это:
@ManyToMany(mappedBy = "favouritedBy")
private Set<Foo> favourites = new HashSet<Foo>();
public Set<Foo> getFavourites() {
return favourite;
}
И fooService имеет это: при доступе к lazyloaded коллекции, когда сеанс открыт, с помощью метода tranactal:
@Transactional(readOnly = true)
public Set<Foo> getFavourites(User user) {
user = dao.get(User.class, user.getId()); //the dao gets a session
Set<Foo> favourites = user.getFavourites();//but the session is not here and the exception is thrown?
return favourties;
}
ИЗМЕНИТЬ Это исправляет его, не используя критерии:
Set<Foo> favourites = new HashSet<Foo>(user.getFavourites());
и это исправляет его с помощью критериев
Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(Foo.class);
crit.setFetchMode("favourites", FetchMode.JOIN);
crit.add(Property.forName("id").eq(id));
return (Foo) crit.uniqueResult();