如何级联删除作为jpa实体一部分的集合?

@Entity public class Report extends Model { public Date date; public double availability; @ElementCollection @Cascade(value={CascadeType.ALL}) public Map categories; } 

在我的一项工作中,我有以下代码:

 int n = MonthlyReport.delete("date = ?", date); 

这总是无法删除具有以下错误的实体:

DELETE语句与REFERENCE约束“FK966F0D9A66DB1E54”冲突。 冲突发生在数据库“TFADB”,表“dbo.MonthlyReport_categories”,列“MonthlyReport_id”中。

如何指定映射,以便在删除报告时删除categories集合中的元素?

级联删除(以及一般的级联操作)仅在通过EntityManager进行操作时才有效。 不是通过JP QL / HQL查询以批量删除方式完成删除。 当通过查询执行删除时,您无法指定将删除链接到ElementCollection的元素的映射。

ElementCollection注释没有cascade属性,因为操作总是级联的。 通过EntityManager.remove()删除实体时,操作将级联到ElementCollection

您必须获取要删除的所有MonthlyReport实体,并为每个实体调用EntityManager.remove 。 在Play框架中看起来不是这样,你也可以在实体中调用delete-method。

我们找到了神奇的门票! 将OnDelete(action = OnDeleteAction.CASCADE)添加到ElementCollection。 这允许我们从SQL中删除项目(在entityManager之外)。