2011-11-25 77 views
2

我有了與其自身多對多關係的實體:如何在遞歸關係中級聯刪除?

@Entity 
public class User { 

    @Id 
    private Long id; 

    @ManyToMany 
    private List<User> friends; 
} 

我怎麼能刪除用戶不刪除所有他的朋友?顯然,我不能使用級聯刪除。如果我嘗試刪除沒有級聯的用戶,我得到一個這樣的錯誤:「無法刪除或更新父行:外鍵約束失敗」

回答

1

通常用ManyToMany我們將映射到不同表中的數據,並且刪除不會造成很大的問題。我覺得你的情況是不同的,你有自我關係。我認爲您需要使用其他方式來執行此操作。

How can I delete a user without deleting all of his friends?下面的選項就是其中之一。

考慮到你的特殊的映射,List<User>User,你應該只更新映射表引用,而不是刪除從User表什麼。因爲他們可能有一些其他User作爲朋友,並可能產生問題。

+0

聽起來不錯,我怎麼做,而不訴諸本地查詢? – Yashima

+0

** HQL **怎麼樣?我不確定是否可以在映射中使用任何選項。 – ManuPK

+0

HQL只比原生查詢好一點點。但我想我必須訴諸於此。現在社交網絡的問題應該更頻繁地出現。但是,然後社交數據krakens不希望刪除數據一旦收集我猜 – Yashima

1

其實我不認爲當使用級聯休眠嘗試刪除朋友,通常應該刪除存儲在另一個表中的兩個用戶之間的鏈接。

這就是爲什麼你有一個違反約束,如果你不級聯,因爲當你嘗試刪除其中一個用戶時,對兩個用戶都有外鍵約束的鏈接(U1,U2)仍然存在。

+0

@ManyToMany(cascade = CascadeType.REMOVE) - >這刪除了關係和用戶,我只是再次檢查。 – Yashima

+0

嗯對不起,我不知道然後 –

+0

沒問題,謝謝無論如何試圖幫助。它可能會結果(見下文),我不能使用註釋來解決這個 – Yashima

0

爲了刪除用戶,您必須從friends所有其他用戶列表中刪除此用戶,因爲在數據庫中這些引用是外鍵。這種移除不能自動完成,即使用註釋。