我的应用程序中有3个主要实体:
用户-可以有多个住宿
住宿-可以有多个便利设施。
我想要实现的是,删除用户后,与此用户分配的所有住宿以及所有住宿实体的便利设施也将被删除。
因此,删除“父母”后,将所有与他相关的内容删除:父母->(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;
}