[英]How make both sides of many-to-many relation ships owner?
我有一个班级Group
和一个班级User
其中 Group 和 User 是多对多关系
如果我更改user
的groups
并保存user
我想更新groups
反之亦然,如果我更改了group
的user
并保存了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.