【问题标题】:How to store userid, roleid and privilegeid in single table using @JoinTable?如何使用@JoinTable 将 userid、roleid 和 privilegeid 存储在单个表中?
【发布时间】:2020-04-25 21:10:32
【问题描述】:

要求:在User实体类中使用@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 的一部分。

问题:如果我在“inverseJoinColumns”中取两个值,我很困惑什么应该是变量类型。

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

    @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"
}

【问题讨论】:

  • 将 JSON 添加到问题中
  • @Rohit 立即查看。
  • 您需要从UserAuthorityOnetoMany 关系以及从AuthorityPrivilege 的另一个OnetoMany 关系。
  • 您的权限在权限上,而不是在用户上。
  • @Rohit 首先感谢您的回答。但是你建议我采用我已经这样做的方式。我的问题是我应该怎么做才能实现这种场景。简而言之,授权具有多种权限,但我们并未向我们提供选定的所有用户提供所有权限。而且用户和权限之间没有任何直接关系,这就是为什么我想在表'pm_user_authority_privilege'中绑定privilege_id

标签: spring spring-boot spring-security jwt


【解决方案1】:

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

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

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

在这种情况下你必须遵循这个,

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

嵌入类:

@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);
      }

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

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

更简短的描述添加评论。

【讨论】:

  • 感谢您的回答,我考虑了这一点,但没有实现对其他一些解决方案的搜索。我肯定会尝试这个,我想它可以工作,但如果我能够使用@JoinTable 来实现它就会变得很高兴。
  • 目前没有,根据我的要求,我只有一个权限分配给单个用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2014-10-19
  • 2019-04-04
  • 2017-11-05
相关资源
最近更新 更多