休眠实体不删除关系

Posted

技术标签:

【中文标题】休眠实体不删除关系【英文标题】:Hibernate entity not deleting relations 【发布时间】:2019-01-08 20:41:40 【问题描述】:

我有一个权限实体关系,其中一个用户可以拥有多个权限。当我尝试向用户更新一个空白的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 仍然是原始长度,这意味着没有删除任何权限。

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

提前致谢。

【问题讨论】:

您是否尝试过在集合上使用 clear() 而不是设置新的 HashSet? 能把修改权限的代码贴出来吗? 【参考方案1】:

您需要在代码中添加 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"))

【讨论】:

以上是关于休眠实体不删除关系的主要内容,如果未能解决你的问题,请参考以下文章

休眠 - 多对多关系中的级联删除

无法使用休眠删除将集合作为子项的实体

在不调用属性的情况下获取休眠惰性关系 n+1 - Kotlin

如果孩子为空,休眠ManyToMany删除另一边

休眠删除实体问题

删除实体时休眠将外键设置为空