多对多映射不起作用,一方设置为反向

时间:2010-01-08 17:19:17

标签: java hibernate many-to-many

多对多的关系。

表格:

Product (productId, ...)
Category (categoryId, ...)
Product_Category(productId, categoryId)

我设置了关系,因此所有更新都将通过Product实体完成。

产品实体:

 private Set<Category> categories = new HashSet<Category>();





public void AddCategory(Category category)
    {
        if(!this.categories.contains(category))
            this.categories.add(category);

        if(!category.getProducts().contains(this))
            category.getProducts().add(this);        
    }

    public void RemoveCategory(AMCategory category)
    {

        if(categories.contains(category))
            categories.remove(category);

        if(category.getProducts().contains(this))
            category.getProducts().remove(this);       
    }

Product.hbm.xml

  <set name="categories" table="product_category" cascade="save-update" lazy="true">
    <key column="productId"/>
    <many-to-many column="categoryId" class="Category"/>
</set>

类别实体:

private Set<Product> products = new HashSet<Product>();

 /**
     * @return the products
     */
    public Set<Product> getProducts() {
        return products;
    }

Category.hbm.xml:

<set name="Products" table="product_category" cascade="none" inverse="true" lazy="true">
        <key column="categoryId"/>
        <many-to-many column="productId" class="Product"/>
    </set>  

现在我有一个循环,我正在创建和保存产品实体,并且还将一个类别与每个实体相关联。

product_category表是空的,所以我想我的映射存在问题。

forloop
{
Product p = new Product();

// set all properties

Category c = DAO.GetCategory(someId);

p.AddCategory(c);


session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(p);
session.getTransaction().commit();

}

我还尝试先保存新产品,然后加载新插入的产品,然后添加类别然后保存,但结果相同,the table product_category is empty.

产品表已插入新产品。

我做错了什么? product_category和product表中都应该有行,但product_category为空。

更新

我的HibernateUtil类:

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            Configuration configuration = new Configuration().configure();



            return configuration.buildSessionFactory();
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }


}

1 个答案:

答案 0 :(得分:1)

当使用inverse属性映射关系的两面时,必须指定反方向 - cascade是完全不同的。 Hibernate需要知道关系的哪一方用于在链接表中保留记录(或者在双向映射的一对多对多的情况下使用外键字段)。