spring-boot - 如何在 User -Role-Permission 中配置 oneToMany 映射
问题描述
我有一个带有 spring data jpa 的 spring boot 应用程序(Spring boot 2)。我有 3 个 MYSQL 表来存储用户信息、角色和权限
- 用户将包含基本的用户详细信息,如用户名、密码名、姓氏。
- 角色代表用户角色,如管理员、用户、员工、测试(用户可以有多个角色)
- 权限有3种可能读、写、自定义(每个角色有很多权限)
- UserRole - 用户和角色的联合表
- RolePermission - 角色和权限的联合表
我正在寻找 Spring boot 服务,如果用户未针对 User 表进行验证,它将返回 false,如果用户成功验证,则响应应包含用户角色和权限。
我能够构建示例休息服务,但未能设置以下
- 如何在此需求中配置 oneToMany 映射的实体类
- 存储库界面中的相应查询是什么
请查看实体表
@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;
}
解决方案
用户与角色、角色与权限实体之间是多对多关系。您不应将连接表定义为实体,它们由 JPA 实现生成/管理。
例如,用户和角色实体的 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 实现。
推荐阅读
- java - 使用外部数据库对 getApplicationContext 的空对象引用
- mysql - 如何使用 nodejs 和 mysql 制作购物车?
- apache-kafka - 如何确定 Kafka 的 API 版本?
- mongodb - 为什么 MongoDB 计数查询有时使用 IXSCAN,解释显示 COUNT_SCAN?
- html - 为什么 IE11 中图标丢失和文本被压缩?
- android - android录音应用程序无法在智能手机上运行
- c# - 将米添加到基于矢量的点
- python - groupby 后无法访问数据框列
- excel - 在 Excel 中复制范围时 PasteSpecial 不保留源格式
- vb.net - 使用 vb.net 写入新创建的命令提示符窗口