无法通过Criteria API删除详细信息记录

时间:2017-06-23 21:02:04

标签: jpa spring-data spring-data-jpa

我的网络应用程序基于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 ...)。

2 个答案:

答案 0 :(得分:1)

这不是架构问题,删除标准不会级联。

所以你有两种选择:

  1. 查询要删除的所有 masters ,并利用详细信息上的级联

  2. 逐个迭代删除
  3. 执行2个条件删除:第一个在详细信息,第二个在主人

答案 1 :(得分:0)

(代表问题作者发布)

对于来到这个线程的人来说,这就是我最终解决方案的实现方式。

  1. 我遵循了Michele建议的“查询要删除的所有母版”。这是一个集合。

  2. repository.delete(the_collection)