我的网络应用程序基于Spring,Spring Data,JPA(Hibernate)和MS SQL服务器构建。我有两个班/表(硕士和细节)。以下是它们的关联方式:
Detail:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "master")
private Master master;
Master:
@OneToMany(mappedBy = "master", fetch = FetchType.LAZY,cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE}, orphanRemoval = true)
private List<Detail> details;
如果我通过常规Spring数据删除(例如delete(id_of_Master_object))删除Master对象,我可以删除Master对象(及其关联的Detail对象级联)。
现在我需要构建一个动态查询来通过Criteria API删除Master对象,我收到了错误:
The DELETE statement conflicted with the REFERENCE constraint "FK_t7dg2y38t1ddm1lrq94cnpk3x". The conflict occurred in database "mydatabase", table "dbo.Detail", column 'master'.
我理解这个错误的本质。该修复应该是什么?上述映射有什么问题吗?
我无法重建数据库。该应用程序已投入生产。如果可以,我想避免对数据库进行任何更改(例如alter table ...)。
答案 0 :(得分:1)
这不是架构问题,删除标准不会级联。
所以你有两种选择:
查询要删除的所有 masters ,并利用详细信息上的级联
执行2个条件删除:第一个在详细信息,第二个在主人
答案 1 :(得分:0)
(代表问题作者发布)。
对于来到这个线程的人来说,这就是我最终解决方案的实现方式。
我遵循了Michele建议的“查询要删除的所有母版”。这是一个集合。
repository.delete(the_collection)