簡體   English   中英

如何在使用Hibernate刪除父項時刪除所有子行?

[英]How to delete all child rows when parent is deleted using Hibernate?

我有2張桌子。

// 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 ,但是如果存在子行,我就無法刪除父行。

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

使用ON DELETE CASCADE ,如果刪除了父級(由密鑰引用), 告訴MySQL它應該刪除一行(其表具有外鍵)。 定義允許此操作,因為在這種情況下,已刪除的記錄具有對它的引用。 相反,如果一個記錄有指向它從其他記錄引用刪除是不允許的。

您在兩個實體中使用cascade = 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;

“mappedBy”屬性表示另一方擁有該關系,因此在您的情況下,Mails擁有的關系可能不是您想要的。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM