2011-10-08 137 views
15
@Entity 
public class Report extends Model { 

    public Date date; 
    public double availability; 

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

在我的工作之一,我有以下代碼:如何級聯刪除作爲jpa實體一部分的集合?

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

這始終無法刪除,錯誤如下實體:

The DELETE statement conflicted with the REFERENCE constraint "FK966F0D9A66DB1E54". The conflict occurred in database "TFADB", table "dbo.MonthlyReport_categories", column 'MonthlyReport_id'.

如何指定映射所以當報告被刪除時,類別集合中的元素會刪除嗎?

+0

JPA不支持對元素集合進行級聯刪除(另請參見[這裏](http://stackoverflow.com/q/3903202/741249)) – THelper

回答

26

級聯刪除(以及一般的級聯操作)僅在通過EntityManager完成操作時纔有效。不是在通過JP QL/HQL查詢進行批量刪除時刪除。當通過查詢完成移除時,您無法指定將鏈移除到ElementCollection中的元素的映射。

ElementCollection註釋沒有級聯屬性,因爲操作總是級聯的。當您通過EntityManager.remove()刪除您的實體時,操作將級聯到ElementCollection

您必須提取所有要刪除的MonthlyReport實體,併爲其中的每個實體調用EntityManager.remove。看起來像在Play框架中,您也可以調用實體中的delete-method。

+0

那麼刪除類別的正確方法是什麼?我注意到,如果我設置外鍵在數據庫本身上級聯,MonthyReport.delete實際上會成功。 – emt14

+0

添加到答案,只需拿你的日期=? - 標準並逐個刪除/刪除。然後刪除將被級聯到類別。 –

+0

這個技巧非常好。謝謝。 – emt14