2014-01-08 65 views
2

我有一個類Group和類User
地方組和用戶很多一對多關係艦
如果我改變usergroups和保存user我想更新groups
反之亦然其中,如果我改變了groupuser並保存group我想user進行更新
我是否必須設置在兩個班mappedBy
注:我使用eclipseLink如何讓多對多關係船舶的所有者?

回答

1

對於多對多關係,您需要更新雙方的關係數據以保持一致。

不幸的是沒有捷徑。

你可以做的是在任何一個實體或第三個類上創建一個方法來封裝一致的更新。

小心無限循環 - 不要在兩個實體類中實現傳播到其他實體。

大致是這樣的:

public class User 
... 
public void addGroup(Group g){ 
    groups.add(g); 
    g.addUser(this); 
} 

public class Group 
... 
public void addUser(User u){ 
    users.add(u); 
    u.addGroup(this); 
} 

我假設的適當級聯設置的關係註釋的存在。

0

擁有關係雙向參考之間的差異。前者主要涉及數據庫的佈局,後者涉及您的應用程序邏輯。從你的問題,我認爲你想要後者。與此同時,通常建議只有關係的一方擁有的參考。您可以輕鬆創建一個雙向的參考,同時保持清晰的集所有者通過創建執行bidrection添加和刪除方法:

class Group { 

    @ManyToMany 
    private Collection<User> users = ... ; 

    public void addUser(User user) { 
    if(user != null && !users.contains(user)) { 
     users.add(user) 
     user.addGroup(this); 
    } 
    } 

    public void removeUser(User user) { 
    if(user != null && users.contains(user)) { 
     users.remove(user) 
     user.removeGroup(this); 
    } 
    } 
} 

class User { 

    @ManyToMany(mappedBy="users") 
    private Collection<Group> groups = ... ; 

    public void addGroup(Group group) { 
    if(group != null && !groups.contains(group)) { 
     groups.add(group) 
     group.addUser(this); 
    } 
    } 

    public void removeGroup(Group group) { 
    if(group != null && groups.contains(group)) { 
     groups.remove(group) 
     group.removeUser(this); 
    } 
    } 
} 

在這個例子中,Group擁有的關係是什麼但是不會影響應用程序的邏輯。請注意操作順序以避免無限循環。另外,請注意,此代碼不是線程安全的。

相關問題