由于 JPQL 查询,我正在尝试从 MOTHER
中删除大量行。
Mother
类定义如下:
@Entity
@Table(name = "MOTHER")
public class Mother implements Serializable {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "mother",
orphanRemoval = true)
private List<Child> children;
}
@Entity
@Table(name = "CHILD")
public class Child implements Serializable {
@ManyToOne
@JoinColumn(name = "MOTHER_ID")
private Mother mother;
}
如您所见, Mother
类有“children”并且在执行以下查询时:
String deleteQuery = "DELETE FROM MOTHER WHERE some_condition";
entityManager.createQuery(deleteQuery).executeUpdate();
抛出异常:
ERROR - ORA-02292: integrity constraint <constraint name> violated -
child record found
当然,我可以先选择所有要删除的对象并将它们检索到列表中,然后遍历它以删除所有检索到的对象,但这样的解决方案的性能会很糟糕!
那么有没有一种方法可以利用先前的映射来有效地删除所有 Mother
对象和所有 Child
与它们关联的对象,而无需先为 所有 子项编写查询?
原文由 Jean Logeart 发布,翻译遵循 CC BY-SA 4.0 许可协议
DELETE(和 INSERT)不通过 JPQL 查询中的关系级联。这在规范中有明确的 说明:
幸运的是,通过实体管理器坚持和删除(当定义了级联属性时)。
你可以做什么:
代码是这样的: