如何使用@JoinTable将用户 ID、角色 ID 和特权 ID 存储在单个表中?



要求:使用用户实体类中的@JoinColumn注释创建表,其中包含user_id,authority_id(表示角色(,privilege_id等列。

条件:权限和特权也有一对多关系。

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "pm_authority_privilege",
joinColumns = @JoinColumn(name = "authority_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "privilege_id", referencedColumnName = "id"))
private Set<Privilege> privileges = new HashSet<>();

根据上述配置,我获得了权限 json 的一部分的权限。

问题:如果我在"反向连接列"中取两个值,我很困惑应该是什么变量类型。

当我尝试使用以下方式做同样的事情时,它会给出事务对象的错误,因为特权存在于两个地方。

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "pm_user_authority_privilege",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = {
@JoinColumn(name = "authority_id", referencedColumnName = "id")
// @JoinColumn(name = "privilege_id", referencedColumnName = "id")
})
private Set<Authority> authorities = new HashSet<>();

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "pm_user_authority_privilege",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "privilege_id", referencedColumnName = "id"))
private Set<Privilege> privileges = new HashSet<>();

注意:有页面没有角色和这些角色的所有相关权限。(使用问题中的代码定义进行处理(

从中我选择了一些角色并在用户创建时保存它们。

{
"authorities": [
{
"authorityId": "ec071816-31e6-11ea-bae1-0242ac110005",
"authorityName": "MANAGER",
"description": null,
"privileges": [
{
"description": "",
"privilege": "CREATE_USER",
"privilegeId": "ba9a4952-4d53-42e9-94fe-8373d334819e"
},
{
"description": null,
"privilege": "SHOW_DATA",
"privilegeId": "ec06de1b-31e6-11ea-bae1-0242ac110005"
}
]
}
],
"email": "test@gmail.com",
"password": "test@123",
"phoneNo": "8575456595",
"status": true,
"userId": null,
"username": "test"
}

我发现了一些东西。它不符合标准,但它有助于解决您的问题。

据我了解,您需要两种关系,

  1. 权限和特权
  2. 用户和权限
  3. 和特权(权限也存在于权限对象中(

在这种情况下,您必须遵循这一点,

  1. 创建一个访问用户信息和权限 JSON 的用户 DTO(因此权限不会显示两次(。
  2. 基于该 JSON 创建两个实体及其对象。一个用于用户,另一个用于用户权限特权。
  3. UserAuthorityPrivilege是包含三个必需数据的表,很明显,这三个数据都是必需的,因此将它们定义为嵌入式密钥。
  4. 给出用户和用户权限特权表之间的关系

嵌入式类 :

@Data
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
public class EmbeddedUserAccess implements Serializable {
@Column(name = "user_id")   private UUID userId;
@Column(name = "authority")   private String authority;
@Column(name = "privilege")   private String privilege;  }

实体类

@Entity
@Table(name = "pm_user_authority_privilege")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserAuthorityPrivilege {
@EmbeddedId
private EmbeddedUserAccess id;
@Null
@Column(name = "store_id", nullable = true)
private UUID storeId;
}

DTO:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDTO {
private UUID userId;
private String username;
private String email;
private String phoneNumber;
private String password;
private Boolean status;
private Authority authority;
}

获取:

UserAuthorityPrivilege access = null;
EmbeddedUserAccess embedded = null;
Set<UserAuthorityPrivilege> accessibilities = new HashSet<>();
Authority authority = userDTO.getAuthority();
for (Privilege privilege : authority.getPrivileges()) {
access = new UserAuthorityPrivilege();
embedded = new EmbeddedUserAccess();
embedded.setUserId(user.getUserId());
embedded.setAuthority(authority.getAuthority());
embedded.setPrivilege(privilege.getPrivilege());
access.setId(embedded);
accessibilities.add(access);
}

您必须以类似的方式更新代码。

我有一个查询,您的用户与单个或多个权限相关。

有关更简短的说明,请添加注释。

相关内容

最新更新