代码之家  ›  专栏  ›  技术社区  ›  L-R

在hibernate中从多对多表检索数据

  •  2
  • L-R  · 技术社区  · 6 年前

    我在用户和广告之间有一个多对多的关系,它是这样映射的

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

    谢谢

    2 回复  |  直到 6 年前
        1
  •  2
  •   Andremoniy    6 年前

    我想你不需要任何标准 找到某个用户喜欢的所有广告 。这很简单:

    public static List<Advert> usersAdverts(User user) {
        Hibernate.initialize(user.getFavourites());
        return user.getFavourites(); 
    }
    

    但是,如果 user 对象从会话中分离-然后打开一个新事务,重新读取该对象并初始化其集合,如我上面所述(分离之前 使用者 来自会话!)。

    :-)

        2
  •  1
  •   L-R    6 年前

    对于存在此问题的任何其他人,上述解决方案仅在查询数据库时有效,但是,为了避免在使用Spark/Velocity函数时出现“Hibernate集合与任何会话都不关联”错误,我必须在代码中添加以下内容:

        public static List<Advert> usersFavAdverts(User user) {
        session = HibernateUtil.getSessionFactory().openSession();
        session.refresh(user);
        Hibernate.initialize(user.getFavourites());
        return user.getFavourites();
    }