我在用户和广告之间存在多对多的关系,这些关系如此映射
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name = "faved_ads",
joinColumns = {@JoinColumn(name = "advert_id", nullable = false, updatable = false)},
inverseJoinColumns = {@JoinColumn(name = "user_id", nullable = false, updatable = false)})
public List<User> getFavouriters() {
return favouriters;
}
@ManyToMany(mappedBy = "favouriters")
public List<Advert> getFavourites() {
return favourites;
}
如果我想查找特定用户喜欢的所有广告,如何从数据库中检索此数据?可以通过创建标准限制或预测来完成吗?
这就是我从一对多检索数据的方式,但无法获得多对多的类似解决方案
public static <T> List<T> getList(Criteria criteria) {
List<T> results = null;
try {
transaction = session.beginTransaction();
results = criteria.list();
transaction.commit();
} catch (HibernateException ex) {
transaction.rollback();
ex.printStackTrace();
} finally {
session.close();
}
return results;
}
public static List<Advert> usersAdverts(User user) {
session = HibernateUtil.getSessionFactory().openSession();
Criteria cr = session.createCriteria(Advert.class);
cr.createAlias("user", "user");
cr.add(Restrictions.eq("user.id", user.getId()));
return getList(cr);
}
由于
答案 0 :(得分:2)
我猜你不需要任何标准来查找某个用户喜欢的所有广告。它很简单:
public static List<Advert> usersAdverts(User user) {
Hibernate.initialize(user.getFavourites());
return user.getFavourites();
}
但是,如果user
对象与会话分离 - 则打开一个新事务,重新读取该对象并按照我上面提供的方式初始化其集合(在从会话中分离user
之前! )。
: - )
答案 1 :(得分:1)
对于有此问题的其他人,上述解决方案仅在查询数据库时有效,但是为了避免在使用Spark / Velocity函数时'Hibernate集合与任何会话无关'错误我必须将以下内容添加到代码:
public static List<Advert> usersFavAdverts(User user) {
session = HibernateUtil.getSessionFactory().openSession();
session.refresh(user);
Hibernate.initialize(user.getFavourites());
return user.getFavourites();
}