角色与用户关系,一个用户可能拥有多个角色,一个角色也能对应多个用户。
主要存在三张表,sys_user(用户表),sys_role(角色表),sys_user_role(用户角色关联表)
实现查询所有用户及所包含的角色权限。
用户SysUser
import javax.persistence.*; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import lombok.Getter; import lombok.Setter; import org.hibernate.annotations.GenericGenerator; /** * @Description: 用户 * @Author: hk * @Date: 2020-06-23 22:37:58 */ @Getter @Setter @Entity @Table(name = "sys_user") public class SysUser extends AbstractAuditable implements Serializable { @Id @GenericGenerator(name = "genericGenerator", strategy = "uuid") @GeneratedValue(generator = "genericGenerator") private Integer id; @Column(name = "name") private String name; @Column(name = "password") private String password; //单向多对多 @ManyToMany(cascade = CascadeType.ALL) @JoinTable(name = "sys_user_role" ,joinColumns = @JoinColumn(name = "user_id",referencedColumnName = "id") ,inverseJoinColumns = @JoinColumn(name = "role_id",referencedColumnName = "id")) private List<SysRole> roles = new ArrayList<>(); }注: @ManyToMany 需要和@JoinTable表结合使用,ManyToMany总是使用中间关系连接表来存储关系。
mappedBy:若关系是双向的则需要使用到。JoinTablce和JoinColumn一般定义在拥有关系的这一端,而mappedBy一定是定义在关系的被拥有方,属性值为中间关联表对应的实体。cascade: CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调用一下refresh()方法 CascadeType.REMOVE:级联删除,当调用remove()方法删除Order实体时会先级联删除OrderItem的相关数据 CascadeType.MERGE:级联更新,当调用了Merge()方法,如果Order中的数据改变了会相应的更新OrderItem中的数据 CascadeType.ALL:包含以上所有级联属性 CascadeType.PERSIST:级联保存,当调用了Persist() 方法,会级联保存相应的数据@JoinTable 如果对象与对象之间有一个关联关系表的时候,就会用到@JoinTable
角色SysRole
import javax.persistence.*; import java.io.Serializable; import lombok.Getter; import lombok.Setter; import org.hibernate.annotations.GenericGenerator; /** * @Description: 角色 * @Author: hk * @Date: 2020-06-23 22:37:57 */ @Getter @Setter @Entity @Table(name = "sys_role") public class SysRole extends AbstractAuditable implements Serializable { @Id @GenericGenerator(name = "genericGenerator", strategy = "uuid") @GeneratedValue(generator = "genericGenerator") private Integer id; @Column(name = "name") private String name; }用户角色关联SysUserRole
/** * @Description: 用户角色关联 * @Author: hk * @Date: 2020-06-23 22:37:58 */ @Getter @Setter @Entity @IdClass(value = SysUserRoleKey.class) @Table(name = "sys_user_role") public class SysUserRole extends AbstractAuditable implements Serializable { @Id @Column(name = "user_id") private String userId; @Id @Column(name = "role_id") private String roleId; }联合主键SysUserRoleKey
import lombok.Getter; import lombok.Setter; import java.io.Serializable; /** * @Description: 用户角色联合主键 * @Author: hk * @Date: 2020-06-23 23:02 */ @Getter @Setter public class SysUserRoleKey implements Serializable { private String userId; private String roleId; public SysUserRoleKey(String userId, String roleId) { this.userId = userId; this.roleId = roleId; } public SysUserRoleKey() { } }这边只是简单查询所用用户及具备的角色权限。所以省略server层与dao层