我有一个类 Group
和类 User
其中组和用户是多对多的关系船 如果我改变了 groups
的 user
并保存一个 user
我想更新 groups
反之亦然,如果我改变了一个 user
的 group
并保存 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);
}
我假设关系注释上存在适当的级联设置。
这两者之间是有区别的。拥有关系 和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
拥有关系,但不影响应用逻辑。要注意操作顺序,以避免无限循环。另外,注意这段代码不是线程安全的。
我知道这对作者来说有点晚了,但也许对其他读者会有帮助。
你可以通过为两边添加@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;
}