【问题标题】:Delete 1:1 parent form child entity without JPA mappings删除没有 JPA 映射的 1:1 父表单子实体
【发布时间】: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


【解决方案1】:

解决了!

事实证明,代码很好(虽然有点糟糕和不标准)。

问题在于 DB 上的外键约束。 on delete 默认设置为 no action。我只需要把它改成set null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2013-12-15
    • 2011-07-13
    • 2018-12-03
    • 2011-07-25
    相关资源
    最近更新 更多