java - 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 变得如此简单,但我想保持类别的自动加载和属性的映射。是否有一种轻量级的方法可以自动执行此操作而无需在每个类别中保留产品列表?
解决方案
您尝试做的事情没有多大意义IMO。
您想保持单向关系,但想要一种直接删除另一方的方法。但我知道问题出在庞大的数据集(类别 -> 产品)。
解决此问题的一种方法是在同一事务中混合 JPQL(删除类别)和本机查询(从连接表中删除行)。
em.createNativeQuery("delete from product_category where category_id = ?").setParameter(1, category.getId()).executeUpdate();
em.remove(category);
推荐阅读
- .net - PubSub API GRPC 调用总是失败并超过最后期限
- java - Tinylog 捕获系统错误输出流到日志文件
- flutter - 如何在 Flutter 中使用图片资源作为图标?
- php - 带有cookie的php curl GET请求
- reactjs - 在 React 中的 DOM 中的注入元素上触发事件
- sql - ORA-01008:并非所有变量都绑定 ORA-06512:在“SYS.DBMS_SQL”,第 1721 行。我正在学习 SQL,但出现此错误
- python - 如何使用自定义的基于 cauchy-schwarz 散度的损失函数来训练 Keras 模型?
- python - 如何将 Pandas.set_option (Python) 应用于 pandas.style 对象
- python - Django cache_page - 预填充/预缓存
- sql - 类似字段上的 INSERT + SELECT 数据类型不匹配