如何在MySQL中正确删除子孙? java.sql.SQLIntegrityConstraintViolationException:无法删除或更新父行

时间:2019-04-29 20:01:13

标签: mysql hibernate jpa spring-data-jpa

我的应用程序中有3个主要实体:

  1. 用户-可以有多个住宿

  2. 住宿-可以有多个便利设施。

我想要实现的是,删除用户后,与此用户分配的所有住宿以及所有住宿实体的便利设施也将被删除。

因此,删除“父母”后,将所有与他相关的内容删除:父母->(OneToMany)住宿->(OneToMany)设施

尝试了多种解决方案,无法使其正常工作。 我不断收到像这样的异常:

java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`holiday_bnb`.`amenities`, CONSTRAINT `FKmfg05g9byiymyp8srifvfa48m` FOREIGN KEY (`accommodation_id`) REFERENCES `accommodations` (`id`))

我不明白。从消息中我知道便利性是与住宿关系的所有者,不能删除,但是我可以在MySQL Workbench中成功完成此操作。

因为我完全是这些主题的新手,所以代码可能很杂乱且“很臭”。经过大量修改,下面的代码是迄今为止最好的(到目前为止),只有一个删除测试在我的测试中失败。

这些是我的Entity类(仅简化为包括这些关系):

用户没有针对住宿的明确JPA映射。 抽象实体仅包含Id属性。

住宿:

public class Accommodation extends AbstractEntity {

    @ManyToOne
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JoinColumn(name = "user_id")
    @NotNull
    private User user;

    @OneToMany(
            fetch = FetchType.EAGER,
            cascade = CascadeType.ALL,
            orphanRemoval = true)
    @Cascade(org.hibernate.annotations.CascadeType.DELETE)
    @JoinColumn(name = "accommodation_id")
    @Singular
    private List<Amenity> amenities;
}

便利设施:

public class Amenity extends AbstractEntity {
    @ManyToOne(cascade = CascadeType.REMOVE)
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Accommodation accommodation;
}

0 个答案:

没有答案