如何让多对多关系的双方船主?

时间:2014-01-08 09:45:21

标签: java jpa many-to-many eclipselink

我有一个班级Group和一个班级User 组和用户是多对多关系的船舶 如果我更改groups的{​​{1}}并保存user我想更新user
反之亦然,如果我更改groups user并保存group,我希望更新group 我是否必须在两个班级中设置user 注意:我使用的是mappedBy

3 个答案:

答案 0 :(得分: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);
}

我假设关系注释中存在适当的级联设置。

答案 1 :(得分: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拥有的关系不会影响应用程序逻辑。注意操作顺序以避免无限循环。另请注意,此代码不是线程安全的。

答案 2 :(得分:0)

我知道对于作者而言,这有点晚了,但也许对其他读者会有所帮助。

您可以通过在两边都添加@JoinTable来实现此目的: (级联,您可以根据需要添加)

.button:visited,
.button:hover,
.button:a {
  color: white
}