场景
以用户、角色、权限的经典方式演绎一下如何使用
一个用户可以拥有多个角色; 一个角色可以被多人同时拥有; 一个角色可以拥有多个权限;
此处只谈用户和角色,暂时不说权限;
需求
在查询用户时同时查询出用户拥有的角色
数据库表
用户表:sys_user
中间表:sys_user_role
角色表:sys_role
关联方式:
sys_user.uid ====> sys_user_role.uid
sys_role.role_name =====> sys_user_role.role_name
实现方式
基类
@Getter
@Setter
@MappedSuperclass()
public abstract class AbstractEntity implements Serializable,Cloneable {
@Id
private Integer id;
@Transient
private LocalDate createTime;
@Transient
private LocalDate updateTime;
角色类
@Getter
@Setter
@Entity
@EqualsAndHashCode(callSuper = true)
@Table(name = "sys_role")
public class SysRole extends AbstractEntity {
@Column(name = "role_name")
private String roleName;
@Column(name = "role_desc")
private String roleDesc;
}
用户类
定义set集合接受级联查询出的角色
1.使用@ManyToMany
2.@JoinTable(name=“指定中间表表名”,joinColumns={ @JoinColumn(name="当前表的外键对应的中间表的列的列名"),referencedColumnName=“当前表的外键列名”},
inverseJoinColumns={ @JoinColumn(name = "另一张表的外键对应的中间表的列的列名", referencedColumnName = "中间表关联的另一张表的外键列名",table = "中间表关联的另一张表表名")
})
@Getter
@Setter
@Entity
@Table(name = "sys_user")
@EqualsAndHashCode(callSuper = true)
public class SysUser extends AbstractEntity {
@Column(name = "uid")
private String userId;
@Column(name = "pwd")
private String pwd;
@ManyToMany
@JoinTable(name = "sys_user_role", joinColumns = {
@JoinColumn(name = "uid", referencedColumnName = "uid",table = "sys_user"),
}
, inverseJoinColumns = {
@JoinColumn(name = "role_name", referencedColumnName = "role_name",table = "sys_role")
})
private Set<SysRole> roleSet = new HashSet<>();
}
用户角色中间表对应类
@Table(name = "sys_user_role")
@Getter
@Setter
@Entity
@EqualsAndHashCode
public class SysUserRole extends AbstractEntity {
@Column(name = "uid")
private String uid;
@Column(name = "role_name")
private String roleName;
}