2010-01-08 55 views
1

多對多的關係。多對多映射不起作用,一邊被設置爲

的表格:

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

我建立的關係,使所有更新將通過產品的實體來完成。

產品實體:

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


} 
+0

在你的文章中修正你的映射 - Product.hbm.xml顯示class =「Product」,在多對多中應該是class =「Category」;並且都不顯示相反。那麼我們可能會看到什麼是錯的。 – 2010-01-08 17:23:36

+0

嗯,也許這是問題,我正在改變一些事情,看看它是否會工作,讓我檢查謝謝。 – mrblah 2010-01-08 17:26:58

+0

好的我修好了,如果我有cascade = none我真的需要inverse = true嗎? – mrblah 2010-01-08 17:31:16

回答

1

必須映射使用inverse屬性關係的雙方時指定逆方向 - cascade是完全不同的東西。 Hibernate需要知道關係的哪一方用於在鏈表中保存記錄(或者在一對多/多對映的情況下都是外鍵字段)。

+0

我的幫助方法AddCategory在產品實體中看起來是否正常? – mrblah 2010-01-08 17:36:34

+0

是的,絕對。如果你用兩種方式進行映射,那麼你需要確保你在這兩種方式中設置。 – 2010-01-08 17:37:32

+0

好吧,現在我收到一個錯誤:嚴重:未能懶洋洋地初始化一個角色集合:blah.Model.Product。類別,沒有會話或會話已關閉 – mrblah 2010-01-08 17:43:42