繁体   English   中英

如何使双方多对多关系船东?

[英]How make both sides of many-to-many relation ships owner?

我有一个班级Group和一个班级User
其中 Group 和 User 是多对多关系
如果我更改usergroups并保存user我想更新groups
反之亦然,如果我更改了groupuser并保存了group我希望user更新
我是否必须在两个类中都设置mappedBy
注意:我正在使用eclipseLink

对于多对多关系,您需要更新双方的关系数据以保持一致。

不幸的是,没有捷径可走。

您可以做的是在实体或第三个类中创建一个方法来封装一致的更新。

当心无限循环 - 不要在两个实体类中实现到另一个实体的传播。

大致是这样的:

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);
}

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

拥有关系双向引用是有区别的。 前者主要涉及数据库的布局,后者涉及应用程序逻辑。 从你的问题来看,我假设你想要后者。 同时,通常建议只有关系的一侧拥有引用。 通过创建强制执行bidrection的add和remove方法,您可以轻松创建双向引用,同时保持明确的集合所有者:

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

我知道对作者来说有点晚了,但也许它会对其他读者有所帮助。

您可以通过为双方添加@JoinTable 来实现这一点:(您可以根据需要添加级联)

public class Group {
    ....

    @ManyToMany
    @JoinTable(
            name = "group_user", 
            joinColumns = @JoinColumn(name = "groups_id"),
            inverseJoinColumns = @JoinColumn(name = "users_id"))
    private List<User> users;
}
public class User {
    ....

    @ManyToMany
    @JoinTable(
            name = "group_user", 
            joinColumns = @JoinColumn(name = "users_id"),
            inverseJoinColumns = @JoinColumn(name = "groups_id"))
    private List<Group> groups;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM