当我从具有其他外键的表中删除一个条目时,相应的记录也不会被删除

Posted

技术标签:

【中文标题】当我从具有其他外键的表中删除一个条目时,相应的记录也不会被删除【英文标题】:When I delete an entry from a table which has foreign keys to others, the corresponding records are not deleted as well 【发布时间】:2019-06-12 14:53:18 【问题描述】:

我有一个表(实体),我根据来自 Java 中不同实体的 ID 从其中删除了一些条目。

这个表有其他表的外键,假设字段是 ID1 和 ID2。 当我使用 HQL 查询删除带有 ID 的条目时,带有 ID1 和 ID2 的条目仍然存在。 那些具有 ID1 和 ID2 的实体与 @ManyToOne(CascadeType.ALL) 连接,所以我不能使用 orphanRemoval = true..

有人知道我应该怎么做吗?

实体类:

@ManyToOne(targetEntity = First.class, cascade = CascadeType.ALL)
@JoinColumn(name = "ID_LINE_HEADER")
private First lineHeader;

@ManyToOne(targetEntity = Second.class, cascade = CascadeType.ALL)
@JoinColumn(name = "ID_LINE_CONTENT")
private Second lineContent;

查询:

        @Query(value = "" +
        "Delete " +
        "from " +
        "   Entity u " +
        "where " +
        "  u.JobExecutionId = :JobExecution ")

【问题讨论】:

您描述的行为是人们通常想要的。级联删除从“一”端到“多”端有意义,但很少从“多”端到“一”端。 How to Delete using INNER JOIN with SQL Server?的可能重复 不,不相关 JPA delete all entites works strange的可能重复 通过 JPQL 批量删除不会触发级联。请参阅上面引用的问题和答案。级联删除只能通过entityManager.remove(e) 触发 【参考方案1】:

转到关系的另一端(在您的情况下为 FirstSecond 类),其中您有 @OneToMany 注释并将 orphanRemoval 属性设置为 true

就像这样:

@OneToMany(mappedBy = "lineHeader", orphanRemoval = true)

【讨论】:

以上是关于当我从具有其他外键的表中删除一个条目时,相应的记录也不会被删除的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SAP ASE Sybase 16 中从具有外键的表中删除行

从具有三个外键的表中选择一个表[关闭]

mysql外键仅引用复合主键的一部分

如何在有外键关系的表中删除数据

oracle中 主键和外键是啥意思?啥地方采用呢?

oracle中 主键和外键是啥意思?啥地方采用呢?