Spring JPA多对多:删除实体,删除连接表中的条目,但不删除另一方

Per*_*osh 6 java spring hibernate jpa

我有这个用例:

  • 我有用户.
  • 我有团体.
  • 用户和组之间存在N:N关系.
  • 我无法删除用户.
  • 如果删除组,则不应删除该组中的用户.

用户方:

@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;
Run Code Online (Sandbox Code Playgroud)

小组方:

@ManyToMany(mappedBy = "groups", cascade = CascadeType.ALL)
private List<UserJPA> returnsList;
Run Code Online (Sandbox Code Playgroud)

如果我从用户的组列表中删除了一个组,该组将从用户列表中删除,它将从连接表中删除,并且不会从组表中删除.这是欲望行为.

但是,如果我删除整个组,会发生什么,连接表中的所有引用都被删除,但也删除了用户!这不可能发生.

我正在使用4.3.5.Final和Spring 4.3.0.RELEASE.

Ale*_*rov 5

您需要从以下位置删除级联= CascadeType.ALL

@ManyToMany(mappedBy = "groups", cascade = CascadeType.ALL)
private List<UserJPA> returnsList;
Run Code Online (Sandbox Code Playgroud)

级联将所有操作传播到关系元素。这意味着当您删除合并时,请保留任何内容...这些操作也在UserJPA实体上执行。

删除组后,您需要知道谁是预购权的所有者。在您的情况下,关系的所有者是UserJPA,这意味着所有更新都应通过所有者进行。

删除级联后,您需要在UserSide上实现如下所示的方法:

removeFromGroup(Group group) {
    user.getGroups().remove(group);
    groups.removeUser(this);
}
Run Code Online (Sandbox Code Playgroud)

这是为了确保集合是同步的。