多對多的關係。多對多映射不起作用,一邊被設置爲
的表格:
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;
}
}
在你的文章中修正你的映射 - Product.hbm.xml顯示class =「Product」,在多對多中應該是class =「Category」;並且都不顯示相反。那麼我們可能會看到什麼是錯的。 – 2010-01-08 17:23:36
嗯,也許這是問題,我正在改變一些事情,看看它是否會工作,讓我檢查謝謝。 – mrblah 2010-01-08 17:26:58
好的我修好了,如果我有cascade = none我真的需要inverse = true嗎? – mrblah 2010-01-08 17:31:16