我有这个用例:
用户方:
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "USERS_GROUPS",
joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID") ,
inverseJoinColumns = @JoinColumn(name = "GROUP_ID", referencedColumnName = "ID") )
private List<GroupJPA> groups;
小组方:
@ManyToMany(mappedBy = "groups", cascade = CascadeType.ALL)
private List<UserJPA> returnsList;
如果我从用户组列表中删除了一个组,该组将从用户列表中删除,它将从连接表中删除,并且不会从组表中删除。这是欲望行为。
但是,如果我删除整个组,会发生什么,连接表中的所有引用都会被删除,但也会删除用户!这不可能发生。
我正在使用4.3.5.Final和Spring 4.3.0.RELEASE。
答案 0 :(得分:4)
您需要从
中删除cascade = CascadeType.ALL@ManyToMany(mappedBy = "groups", cascade = CascadeType.ALL)
private List<UserJPA> returnsList;
级联将所有操作传播到关系元素。这意味着当您删除合并时,保留任何...这些操作也在UserJPA实体上执行。
删除群组后,您需要了解谁是预备权的所有者。在您的情况下,关系的所有者是UserJPA,这意味着所有更新都应通过所有者进行。
删除级联后,您需要在UserSide上实现一个如下所示的方法:
removeFromGroup(Group group) {
user.getGroups().remove(group);
groups.removeUser(this);
}
这是为了确保集合同步。