Почему мой метод remove () не удаляет ссылку из БД, используя JPA @ Many-to-Many? - PullRequest
4 голосов
/ 23 марта 2009

В моем приложении установлены довольно простые отношения JPA @ManyToMany. A Product является частью одного или нескольких OrderSystem s. Каждый OrderSystem может иметь много Product с. Это типичные отношения «многие ко многим».

Проблема, с которой я борюсь, заключается в следующем: если я использую orderSystems.remove() для удаления ссылки с Product на OrderSystem, запись, кажется, будет удалена (в этом сеансе). Однако эта запись не удаляется из таблицы перекрестных ссылок при сбросе, и когда я перезагружаю Product, она имеет предыдущий набор OrderSystem s.

У меня есть следующий код:

@Entity
@Table(name = "p_product_versions")
@Validation
public class Product {
    private List<OrderSystem> orderSystems;
    @ManyToMany
    @JoinTable(name = "p_order_systems_has_product_versions", 
            joinColumns =
                @JoinColumn(name = "p_product_versions_prod_version_id"),
            inverseJoinColumns =
                @JoinColumn(name = "p_order_systems_system_id"))
    public List<OrderSystem> getOrderSystems() {
        return orderSystems;
    }

}

@Entity
@Table(name = "p_order_systems")
@Validation
public class OrderSystem {
    private List<Product> products;
    @ManyToMany (mappedBy = "orderSystems")
    public List<Product> getProducts() {
        return products;
    }
}

Может кто-нибудь указать мне на то, что мне здесь не хватает?

Ответы [ 3 ]

2 голосов
/ 31 марта 2009

Оказалось, что проблема была в том, что я не очищал отношения в обоих направлениях. Я бы удалил Продукт из OrderSystem, но не удалил OrderSystem из Product.

2 голосов
/ 23 марта 2009

Как выглядит код, в котором вы выполняете удаление? Вы делаете это в транзакции, и вы не забыли зафиксировать свои изменения?

1 голос
/ 16 декабря 2010

Вы должны удалить отношения с обеих сторон. Способ сделать это:

// Find your 2 beans with entityManager

product.setOrderSystems(null);
orderSystem.setProducts(null);

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