![](/img/trans.png)
[英]Hibernate: How to ensure that a parent is not deleted when all its child entities are?
[英]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.