2011-05-24 68 views
0

考慮這個用例。JPA CascadeType.ALL不刪除子記錄

class Category { 
    @OneToMany(cascade=CascadeType.ALL) 
    List<Application> applications = new ArrayList<Application>(); 
} 

class Application { 
    @ManyToOne 
    Category category;  
} 

我明白,在這種情況下,當類別被刪除時,應用程序也會被刪除。但誰照顧連接表?爲關係生成的Category_Application表。

回答

2

連接表的行應該總是被刪除,不管級聯與否。

對於雙向ManyToMany擁有(non-mappedBy)方將刪除行。

既然你有一個ManyToOne回來,看來你應該使用mappedBy而不是一個連接表。

問題是他們沒有被刪除,或者你在刪除之前得到一個約束錯誤?還要確保在調用remove()時收集si不爲空。在調用remove之前,嘗試從集合中刪除所有內容。

+0

I James,謝謝你的回覆。不,我沒有收到任何錯誤,但連接表的行不會被刪除。這是我唯一的問題。 當我刪除實體時,我不確定該實體是否具有填充連接值的集合。但不是它表格引用應該默認刪除它,即使我沒有收集完成?由於我提到的級聯類型? – Jahid 2011-05-25 09:28:44

+0

如果集合爲空,則不需要刪除,因爲沒有要刪除的行。你是如何得到你要刪除的對象的?您使用的是JPA提供商和版本? – James 2011-05-25 13:51:05

2

聽起來好像這是相同的問題:

JPA CascadeType.ALL does not delete orphans

基本上,當你有一個@OneToMany,JPA假設默認情況下,該子對象具有獨立生命週期,並可以關聯到多個家長。刪除父母並不一定會刪除孩子。在JPA 2.0中指定orphanRemoval=true(或Eclipselink @PrivateOwned或Hibernate CascadeType.DELETE_ORPHAN)告訴JPA在刪除父項時刪除子記錄。

如果您始終想要將子記錄lifecyle綁定到其父項,您可能還需要考慮@ElementCollection而不是@OneToMany,它會給出類似的行爲,但不會讓您獨立於父項保留子對象。 (即@ElementCollection的子對象不是@Entities。)