java - 无法使用 JPA 删除表中的行而不抛出异常
问题描述
我有一些代码使用以下代码从表中删除一行:
EntityManager em = getEntityManager();
try
{
final EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.remove(data);
transaction.commit();
} catch (final PersistenceException e) {
{
throw new CPDPersistenceException(e);
}
错误消息是:无法删除或更新父行:外键约束失败......等等。
问题是我要删除的表中存在其他表“reference_id”的外键。但是,无论此主键存在于定义它的持久 Java 对象中的何处,它都有一个应该导致级联删除的引用。例如:
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="reference_id")
private Reference reference;
通过阅读有关此主题的其他条目,我的理解是,附加到参考的“级联”短语将解决删除与其他表中的其他条目相关的条目的问题。有人有什么想法吗?
解决方案
我从您的代码中了解到,您不应该为被引用实体的拥有实体字段设置 @ManyToOne 注释的级联属性。相反,您必须在父实体中为子实体字段设置@OneToMany注解的级联属性。例如:
class ParentEntity {
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private ChildEntity child;
...
}
class ChildEntity {
@ManyToOne
private ParentEntity parent;
...
}
推荐阅读
- html -
- angular - 从来自后端的 Json 填充 Angular 中的谷歌饼图
- excel - Excel - 在两列中列出每个唯一对来自 excel 中的两个源列
- java - FileProvider.getUriForFile 上下文抛出 NullPointer 异常
- java - 为什么 Android Studio 构建找不到符号变量 MockPackageManager?
- ios - performSegue 不工作并导致崩溃
- bash - 如何使用 bash 脚本递归地将 S3 中的文件从文件夹复制到另一个文件夹?
- java - java语句的范围
- apache-kafka - SQS 风格的分布式延迟队列,但在 AWS 之外?
- regex - Regex 根据 Regex 将字符串拆分为 N 个匹配项