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