отображение много-ко-многим не работает, одна сторона настроена на обратную - PullRequest
1 голос
/ 08 января 2010

Отношение ко многим.

Таблицы:

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, а также связываю одну категорию с каждой.

Таблица 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 Ответ

1 голос
/ 08 января 2010

Вы должны указать обратное направление при отображении обеих сторон отношения с помощью атрибута inverse - cascade - это нечто совершенно другое. Hibernate должен знать, какую сторону отношения использовать для сохранения записи в таблице ссылок (или в поле внешнего ключа в случае сопоставления «один-много / много-один» в обе стороны).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...