Foo看起来有这个:
@ManyToMany
private Set<User> favouritedBy;
当用户拥有此时:
@ManyToMany(mappedBy = "favouritedBy")
private Set<Foo> favourites = new HashSet<Foo>();
public Set<Foo> getFavourites() {
return favourite;
}
fooService拥有这个功能,使用事务方法在会话打开时访问延迟加载的集合:
@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();