【问题标题】:Spring JPA Many to Many: remove entity, remove entry in join table, BUT NOT REMOVE the other sideSpring JPA 多对多:删除实体,删除连接表中的条目,但不删除另一侧
【发布时间】:2016-11-12 21:28:10
【问题描述】:

我有这个用例:

  • 我有用户。
  • 我有群组。
  • 用户和组之间存在 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;

组方:

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

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

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

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

【问题讨论】:

  • 这似乎是一个 Hibernate/JPA 问题;我不认为这里涉及到 Spring。
  • 可能对你有帮助 cascading delete.

标签: java spring hibernate jpa


【解决方案1】:

您需要从

中删除 cascade = CascadeType.ALL
@ManyToMany(mappedBy = "groups", cascade = CascadeType.ALL)
private List<UserJPA> returnsList;

级联将所有操作传播到关系元素。这意味着当你删除合并时,坚持任何东西......这些操作也在 UserJPA 实体上执行。

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

移除 Cascading 后,您需要在 UserSide 上实现一个方法,如下所示:

removeFromGroup(Group group) {
    user.getGroups().remove(group);
    groups.removeUser(this);
}

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

【讨论】:

  • 感谢您的评论。我已经尝试过删除 CascadeType.ALL,当我尝试删除一个组时,我得到一个约束异常,因为我正在删除一个组,但我没有删除连接表中的相关条目。但至少,删除 CascadeType.ALL 可以防止我删除用户的情况。从用户列表中删除组仍然可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2019-02-11
  • 2021-07-12
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多