【问题标题】:How to configure oneToMany Mapping in User -Role-Permission如何在 User -Role-Permission 中配置 oneToMany 映射
【发布时间】:2019-02-13 01:00:39
【问题描述】:

我有一个带有 spring 数据 jpa 的 spring boot 应用程序(Spring boot 2)。我有 3 个 MYSQL 表来存储用户信息、角色和权限

  • 用户将包含基本的用户详细信息,例如用户名、密码、名字、姓氏。
  • Role 代表用户角色,例如 Admin ,User,Staff,test (用户可以拥有多个角色)
  • 权限有3种可能读、写、自定义(每个角色有很多权限)
  • UserRole - 用户和角色的联合表
  • RolePermission - 角色和权限的联合表

我正在寻找 Spring 引导服务,如果用户未针对 User 表进行验证,它将返回 false,如果用户成功验证,则响应应包含用户角色和权限。

我能够构建示例休息服务,但未能设置以下内容

  1. 如何为这个需求中的 oneToMany 映射配置实体类
  2. 存储库界面中的相应查询是什么

请查看实体表

@Entity
@Table( name = "TURBINE_USER" )
public class PortalUser {

public PortalUser() {

}

public PortalUser(long userID ,String userName , String password , String firstName, String lastName, String email) {
    this.userID = userID;
    this.userName = userName;
    this.password = password;
    this.firstName = firstName;
    this.lastName = lastName;
    this.email =  email;
}


@Id
@Column(name="USER_ID",unique=true)
private long userID;

@NotNull
@Column(name="LOGIN_NAME",unique=true)
private String userName;

@NotNull
@Column(name="PASSWORD_VALUE")
private String password;

@NotNull
@ColumnDefault("")
@Column(name="FIRST_NAME")
private String firstName;

@NotNull
@ColumnDefault("")
@Column(name="LAST_NAME")
private String lastName;

@Column(name="EMAIL")
private String email;

@Column(name="CONFIRM_VALUE")
private String confirmValue;

@NotNull

@Column(name="CREATED")
private Timestamp createdDt;

@NotNull

@Column(name="MODIFIED")
private Timestamp modified;

@NotNull
@Column(name="LAST_LOGIN")
private Timestamp lastLogin;

@Column(name="DISABLED")
private char disabled;

@Column(name="OBJECTDATA")
private byte[]  objectData;

@NotNull
@Column(name="PASSWORD_CHANGED")
private Timestamp passwordChanged;
 // getters and setters
}


@Entity
@Table(name =  "TURBINE_ROLE")
public class Role {
    @Id
    @Column(name=  "ROLE_ID",unique  = true)
    private long roleId;

    @Column(name= "ROLE_NAME")
    private String roleName;

}


@Entity
@Table(name ="TURBINE_PERMISSION")
public class Permission {

    @Id
    @Column(name=  "PERMISSION_ID")
    private long permissionId;

    @Column(name= "PERMISSION_NAME")
    private String name;
}

@Entity
@Table(name= "TURBINE_USER_GROUP_ROLE")
public class UserRoles {

    @Column(name="USER_ID")
    private PortalUser user;

    @Column(name="ROLE_ID")
    private Role roles;
}


@Entity
@Table(name="TURBINE_ROLE_PERMISSION")
public class RolePermission {

    @Column(name= "ROLE_ID")
    private Role roleId;

    @Column(name= "PERMISSIONID")
    private Permission permissionId;
}

【问题讨论】:

    标签: spring-boot jpa spring-data-jpa spring-data one-to-many


    【解决方案1】:

    User 和 Role、Role 和 Permission 实体之间是多对多的关系。您不应将连接表定义为实体,它们由 JPA 实现生成/管理。

    例如,User 和 Role 实体的 ManyToMany 注释:

    public class PortalUser {
        ...
    
        @ManyToMany(fetch = FetchType.LAZY)
        @JoinTable(name = "User_Role",
            joinColumns = {@JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id")})
        private Set<Role> roles;
    }
    

    CMobileCom JPA测试。

    免责声明:我是CMobileCom JPA 的开发人员,这是一个适用于 Java 和 Android 的轻量级 JPA 实现。

    【讨论】:

      【解决方案2】:

      定义 User-Role-Permission 之间关系的一种简单方法如下 - 为 RolePermission 定义实体类并声明多对多关系在 User 实体中,自动创建了两个链接表 user_roleuser_permission

      1.角色实体类

      @Entity
      @Table(name = "ROLE")
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class Role {
      
          @Id
          @GeneratedValue(strategy = GenerationType.AUTO)
          private long id;
          .
          .
          .
      
      }
      

      2。权限实体类

      @Entity
      @Table(name = "PERMISSION")
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class Permission {
      
          @Id
          @GeneratedValue(strategy = GenerationType.AUTO)
          private long id;
          .
          .
          .
      
      }
      

      3.用户实体类

      @Entity
      @Table(name = "USER")
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class User {
      
          @Id
          @GeneratedValue(strategy = GenerationType.AUTO)
          private long id;
          .
          .
          .
      
          // Relation with role
          @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
          @JoinTable(name="USER_ROLE",
              joinColumns = {@JoinColumn (name="USER_ID", referencedColumnName="id")},
              inverseJoinColumns = {@JoinColumn(name="ROLE_ID", referencedColumnName="id")}
          )
          private List<Role> roles;
      
          // Relation with permission
          @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
          @JoinTable(name="USER_PERMISSION",
              joinColumns = {@JoinColumn (name="USER_ID", referencedColumnName="id")},
              inverseJoinColumns = {@JoinColumn(name="PERMISSION_ID", referencedColumnName="id")}
          )
          private List<Permission> permissions;
      
      }
      

      【讨论】:

        猜你喜欢
        • 2012-09-17
        • 2014-04-08
        • 1970-01-01
        • 1970-01-01
        • 2019-10-27
        • 2019-03-27
        • 2020-02-09
        • 1970-01-01
        • 2022-12-12
        相关资源
        最近更新 更多