yas*_*dev 7 java hibernate jpa
我有2个实体:Role和Privilege.一个角色有很多特权.实体看起来像这样:
@Entity
public class Role {
private Integer id;
private String code;
@OneToMany(mappedBy = "role", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Privilege> privileges;
}
@Entity
public class Privilege {
private Integer id;
private String code;
@ManyToOne
@JoinColumn(name = "role_id")
private Role role;
}
Run Code Online (Sandbox Code Playgroud)
该privilege表U__ROLE_ID__CODE__PRIVILEGE对role_id和code列具有唯一约束.
我有一个更新角色的REST端点.此更新还包括更改分配给角色的权限:
private static void setPrivileges(Set<Privilege> existing, Set<Privilege> privileges) {
existing.clear();
existing.addAll(privileges);
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我更新角色时,Hibernate首先将新权限插入到权限表中,然后才删除孤立权限.因此,U__ROLE_ID__CODE__PRIVILEGE如果新的权限列表包含来自旧列表的至少一个权限,则更新将失败并出现约束冲突.
没有约束,一切正常.但是,删除约束看起来不是一个完美的解决方案.
是否可以更改Hibernate处理角色权限关系更新的顺序,以便首先删除孤立权限,然后才插入新权限?
复制项目可在此处获得.
小智 -1
// You can flush:
private static void setPrivileges(Set<Privilege> existing, Set<Privilege> privileges) {
existing.clear();
repository.flush(); // queues delete statements before subsequent operations
existing.addAll(privileges);
}
Run Code Online (Sandbox Code Playgroud)