休眠实体不删除关系

时间:2019-01-08 20:41:40

标签: java hibernate jpa

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

关于休眠实体,我在做错什么还是不了解?

谢谢。

1 个答案:

答案 0 :(得分: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"))