2013-06-13 152 views
1

我有2個表格。如何使用Hibernate刪除父項時刪除所有子行?

// Accounts 
@OneToMany(mappedBy="accounts", cascade=CascadeType.ALL) 
@Cascade(org.hibernate.annotations.CascadeType.ALL) 
private Set<Mails> mails; 

// Mails 
@ManyToOne(cascade=CascadeType.ALL) 
@JoinColumn(name="user_id" , referencedColumnName="id", insertable=false, updatable=false) 
private Accounts accounts; 

如何整理刪除所有的子行,當父行會被刪除?我試圖爲Accounts表設置CascadeType.DELETE_ORPHAN,但是如果存在子行,我不能刪除父行。

+0

你可以顯示'show create table'這兩個表的MySQL輸出? – marekful

+0

@MarcellFülöphttp://pastebin.com/N4y0LBmY –

+0

SQL語法是正確的,符合我的答案,但是我沒有看到InnoDB明確要求的外鍵定義中的ON DELETE CASCADE引擎在表級別允許自動子刪除。 – marekful

回答

4

問題可能是關係是在錯誤的方向上定義的。假設您有一個與mail表有一對多關係的account表,如果您將account上的關係定義爲mail,則最終將無法從account刪除記錄,直到它具有關聯的mail行。正確的方法是在mail上創建外鍵以參考account

隨着ON DELETE CASCADE,你告訴MySQL,它應該刪除行(其表有外鍵)如果其父(由鍵引用)被刪除。這個操作是定義允許的,因爲在這種情況下,刪除的記錄對它的引用。相反,如果記錄的引用指向其他記錄),則不允許刪除。

+0

我忘了ON DELETE CASCADE選項。但現在我不能編輯或刪除父行。我試圖手動添加外鍵,它完美地工作。 ALTER TABLE郵件添加外鍵(user_id)參考帳戶(id)ON DELETE CASCADE ON UPDATE RESTRICT 錯誤在哪裏? –

+0

錯誤代碼1451,SQL狀態23000:無法刪除或更新父行:外鍵約束失敗 –

+0

使用ON UPDATE RESTRICT MySQL如果引用了它,則不允許更新_referenced_字段(Accounts.id)。像'ON DELETE CASCADE'允許刪除帳戶行(並自動刪除引用已刪除帳戶行的郵件行),「ON UPDATE CASCADE」允許更新由一個或多個郵件行引用的帳戶行中的「id」字段(並且它也會更新引用字段(Mail.user_id))。 – marekful

0

「mappedBy」屬性表明對方擁有這種關係,所以在你的情況下,郵件擁有的關係可能不是你想要的。

JPA Cascades只能從關係所有者的一個方向工作。

所以,如果你想對郵件刪除帳戶時,可以刪除,你需要切換關係的所有者:

//Accounts 
@OneToMany(cascade=CascadeType.ALL) 
private Set<Mails> mails; 

//Mails 
@ManyToOne(mappedBy="mails") 
@JoinColumn(name="user_id" , referencedColumnName="id", insertable=false, updatable=false) 
private Accounts accounts; 
+1

@ManyToOne(mappedBy =「郵件」) 它不工作。說,我不能將mappedBy添加到ManyToOne註釋。 –

1

您在兩個實體使用級聯= CascadeType.ALL。嘗試僅在父級使用。這應該工作

//Accounts 
@OneToMany(mappedBy="accounts", cascade=CascadeType.ALL,orphanRemoval=true)  
private Set<Mails> mails; 

//Mails 
@ManyToOne 
@JoinColumn(name="user_id" , referencedColumnName="id" , nullable=false) 
private Accounts accounts; 
+0

orphanRemoval = true在休眠中不存在。沒有它我有相同的結果 –

+0

它確實存在(可能您使用的是舊版本),它對我很有用例如,當您從使用Uni方向的父級集合中移除其中一個子元素時,請注意orphanRemoval與ON DELETE CASCADE無關http://stackoverflow.com/questions/4329577/jpa-2-0 -orphanremoval-true-vs-delete-cascade –

+0

我更新了hibernate並添加了orphanRemoval選項,但它沒有幫助:( –

相關問題