2011-12-28 84 views
2

我使用相同的實體創建了關係@ManyToMany。從@ManyToMany列表中刪除對象的正確方法

這裏是我的實體:

@Entity 
@Table(name = "user") 
public class User extends BaseEntity implements Serializable { 

... 

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "table_friends", joinColumns = 
@JoinColumn(name = "userId"), inverseJoinColumns = 
@JoinColumn(name = "friendId")) 
private List<User> friends; 

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "table_friends", joinColumns = 
@JoinColumn(name = "friendId"), inverseJoinColumns = 
@JoinColumn(name = "userId")) 
private List<User> friendsof; 

我創建了幾個「用戶」,並將其添加到好友列表:

User u1 = new User(); 
User u2 = new User(); 
User u3 = new User(); 

u1.getFriends().add(u2); 
u1.getFriendsof().add(u2); 
u1.getFriends().add(u3); 
u1.getFriendsof().add(u3); 

當我從列表中刪除u1.getFriends().remove(u3)的朋友,一切正常。但是當我想從數據庫u3.remove()中刪除用戶時,u1的朋友仍然是一樣的,雖然已經在朋友的數據庫列表中是正確的。

  1. 可以在刪除用戶後以某種方式刷新列表嗎?
  2. 如果是這樣,我怎麼知道我需要刷新哪個朋友列表?

編輯:在我看來,我應該刪除(cascade = CascadeType.ALL),因爲當我刪除u1時,刪除所有配對的成員。這是正確的行爲?

回答

3

嗯,爲什麼你需要2列表friendsfriendsOf?如果你是我的朋友,難道我不是你的朋友嗎?

此外,如果您只想結束2 User之間的關係,則應該使用u1.getFriends().remove(u3)

最後,如果你想刪除一個用戶。您應該創建一個EntityManager em並執行命令em.remove(u3)。這個命令將刪除u3以及關係。但是,您應該注意cascade = CascadeType.ALL。這cascadeType意味着如果你刪除u3,u1也將被刪除。我認爲你應該離開它@ManyToMany沒有級聯。

+0

所有級聯我已經刪除。說到刪除,我使用EntityManager em.remove(u)。但它並不像我想象的那樣工作,因爲在em.remove(u3)之後,當我檢查數據庫(由MySQL管理員)時,u3不存在,但它仍存在於u1.friends中。重新啓動程序後消失。任何想法爲什麼這麼晚? – galica 2011-12-28 11:04:57

+0

嗯,這很奇怪。我試圖刪除我的應用程序中的條目,並且所有關係都已正確更新。 ^^我認爲你應該用這個奇怪的行爲更新你的問題。我相信其他人能夠幫助你 – 2011-12-28 11:45:10

+0

你能分享你是如何做到的嗎? – galica 2011-12-28 11:54:12

0

我發現了另一個解決方案,但只有當我們使用EclipseLink。

在persistance.xml您需要添加屬性:

<property name="eclipselink.cache.shared.default" value="false"/> 

然後一切工作正常。

相關問題