【发布时间】:2020-05-08 08:10:18
【问题描述】:
我有一种情况,我需要在删除子实体时删除任何关联的父实体,反之亦然。但是出于“性能”的原因,所有者没有在实体中包含任何类型的 JPA 映射。如果我在删除子项之前先手动删除父项,则由于 FK 约束而失败,反之亦然。任何人都可以帮忙吗? 实体:
@Table(name = "child_node")
public class ChildNodeEntity {
@Id
private Long id;
@Column(name = "case_id")
private String caseId;
@Column(name = "parent_id", updatable = false)
private String parentId;
}
@Table(name = "parent_node")
public class ParentNodeEntity {
@Id
private Long id;
@Column(name = "case_id")
private String caseId;
}
这里在子实体中,parentId 保存为字符串(为了避免性能问题以及让父对象在项目中的任何地方都没有用处)。
下面是从子级删除父级的代码:
@Transactional
private void deleteBauCase(String caseId) {
ChildNodeEntity child = service.getChildNodeEntityById(caseId);
ParentNodeEntity parent = service.getParentNodeEntityById(caseId);
parentNodeRepository.delete(parent);
childNodeRepository.delete(child);
}
如何删除这两个实体?反之亦然(从父级中删除子级)。 我不能使用@OnetoOne 映射和级联删除。还有其他方法可以执行此操作吗?外键约束在数据库端。请帮助,因为我只熟悉使用注释。
【问题讨论】:
-
如果两者都是 FK,您需要级联删除,这实际上是对数据库的约束,您无法绕过它。此外,您不使用 JPA 映射的理由毫无意义,
parentId is kept as String (to avoid performance issues -
使用
JDBC并将delete方法放在@Tracational注解下。 -
@PatrickChen 抱歉,我在复制粘贴中省略了 Transactional。它在事务下运行
-
@123 FK 只是一侧。
-
@123 解决了!事实证明,代码很好(虽然有点糟糕和不标准)。问题在于数据库的外键约束。
on delete默认设置为no action。我只需要把它改成set null。
标签: java spring oracle hibernate jpa