一尘不染

如何级联删除属于jpa实体的集合?

hibernate

@Entity
public class Report extends Model {

    public Date date;
    public double availability;

    @ElementCollection
    @Cascade(value={CascadeType.ALL})
    public Map<FaultCategory, Integer> categories;      
}

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

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

这始终无法删除具有以下错误的实体:

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

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


阅读 393

收藏
2020-06-20

共1个答案

一尘不染

级联删除(通常是级联操作)仅在通过操作完成时有效EntityManager。当通过JP QL /
HQL查询作为批量删除完成删除时不可以。您无法指定在ElementCollection通过查询完成删除时将删除链接到元素的映射。

ElementCollection注释没有层叠属性,因为操作始终是层叠的。通过删除实体时EntityManager.remove(),操作会级联到ElementCollection

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

2020-06-20