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

问题描述 投票:2回答:3

我有一个类 Group 和类 User 其中组和用户是多对多的关系船 如果我改变了 groupsuser 并保存一个 user 我想更新 groups 反之亦然,如果我改变了一个 usergroup 并保存 group 我想要的 user 我是否必须设置 mappedBy 在这两个类中 注:我使用的是 eclipseLink

java jpa many-to-many eclipselink
3个回答
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
投票

这两者之间是有区别的。拥有关系 和a 双向参考. 前者主要涉及到你的数据库的布局,后者涉及到你的应用逻辑。从你的问题来看,我假设你想要的是后者。同时,一般建议关系中只有一边是 "关系"。拥有 的引用。您可以通过创建强制执行 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 拥有关系,但不影响应用逻辑。要注意操作顺序,以避免无限循环。另外,注意这段代码不是线程安全的。


0
投票

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

你可以通过为两边添加@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;
}
© www.soinside.com 2019 - 2024. All rights reserved.