首页 > 解决方案 > 休眠实体不删除关系

问题描述

我有一个权限实体关系,其中一个用户可以拥有多个权限。当我尝试向set用户更新空白时,更新没有发生。

我的实体

@Entity
public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String clientId;

    private String userName;

    private String userStatus;

    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.EAGER)
    private Users parentUserId;

    @Builder.Default
    @OneToMany(mappedBy = "parentUserId", fetch = FetchType.EAGER)
    private Set<Users> children = new HashSet<>();

    @OneToMany(mappedBy = "user", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
    @Builder.Default
    private Set<AccessMapping> permissions = new HashSet<>();

    private Long updatedAt;
}



@Entity
public class AccessMapping {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinTable(name = "FeatureGroupPermissions",
    joinColumns = @JoinColumn(name = "FeatureGroupId"),
    inverseJoinColumns = @JoinColumn(name = "PermissionId"))
    private FeatureGroups featureGroup;

    @ManyToOne
    @JoinTable(name = "UserPermissions",
    joinColumns = @JoinColumn(name = "UserId"),
    inverseJoinColumns = @JoinColumn(name = "PermissionId"))
    private Users user;

    private String accessType;

    private Long updatedAt;
}

一位用户拥有多个功能组的权限。

权限 hashSet 的大小相当于用户拥有的权限数。如果我想删除用户的所有权限,我将设置一个空白的 hashSet 并使用EntityManager.merge()函数更新用户。但这不起作用。权限仍然存在,当我获取用户时,hashSet 仍然是原始长度,这意味着没有删除任何权限。

我在做什么错或不了解休眠实体?

提前致谢。

标签: javahibernatejpa

解决方案


您需要在代码中添加 orphanremoval=true 。

@OneToMany(mappedBy = "user", cascade = {CascadeType.ALL}, orphanRemoval = true, fetch = FetchType.EAGER)

有关详细信息,您可以参考此链接:

JPA 2.0 orphanRemoval=true VS on delete Cascade

而且,你的可连接设置看起来很奇怪,它应该是这样的(第一列是拥有方):

@JoinTable(name = "UserPermissions",
        joinColumns = @JoinColumn(name = "PermissionId"),
        inverseJoinColumns = @JoinColumn(name = "UserId"))

推荐阅读