首页 > 解决方案 > JPA 多对多和单向删除

问题描述

我有以下关系:

class Product { // 10000s many of them

 @ManyToMany
 List<Category> categories; //usually 0-5 

}

class Category {
...with no back link...
}

现在,如果我删除一个类别,然后加载具有该类别的产品,我将收到一个错误,其中包含:

表“类别”上的更新或删除违反了外键约束(...)仍然从表 product_category 中引用

我看过许多答案和教程,但问题是许多人确实建议在 Category 中添加 Product 作为双向关系,然后在删除类别之前,我将检查所有 Products 并删除该特定类别。但是这里的产品成千上万,运行时间太长。

这可以通过使用普通 SQL 变得如此简单,但我想保持类别的自动加载和属性的映射。是否有一种轻量级的方法可以自动执行此操作而无需在每个类别中保留产品列表

标签: javahibernatejpa

解决方案


您尝试做的事情没有多大意义IMO。

您想保持单向关系,但想要一种直接删除另一方的方法。但我知道问题出在庞大的数据集(类别 -> 产品)。

解决此问题的一种方法是在同一事务中混合 JPQL(删除类别)和本机查询(从连接表中删除行)。

em.createNativeQuery("delete from product_category where category_id = ?").setParameter(1, category.getId()).executeUpdate();
em.remove(category);

推荐阅读