为什么我的remove()实际上没有使用JPA @ Many-to-Many从DB中删除引用

时间:2009-03-23 18:43:37

标签: jpa many-to-many

我的应用程序中设置了一个非常简单的JPA @ManyToMany关系。 Product是一个或多个OrderSystem的一部分。每个OrderSystem都可以包含多个Product个。这是典型的多对多关系。

我正在解决的问题是:如果我使用orderSystems.remove()删除ProductOrderSystem的引用,则该条目似乎已被删除(在该会话中) )。但是,在刷新时不会从交叉引用表中删除该条目,当我重新加载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 个答案:

答案 0 :(得分:2)

您执行删除操作的代码是什么样的?你是在交易中做的,还记得提交更改吗?

答案 1 :(得分:2)

原来问题是我没有在两个方向清除关系。我会从OrderSystem中删除一个产品,但不会从产品中删除OrderSystem。

答案 2 :(得分:1)

您需要从双方中删除关系。 做到这一点的方法是:

// Find your 2 beans with entityManager

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

// then persist() and flush()