我使用批注拥有具有联接表role\u权限的角色和权限表:
@OneToMany
@JoinTable(name="ROLE_PERMISSION", joinColumns=@JoinColumn(name="role_id"),
inverseJoinColumns=@JoinColumn(name="permission_id"))
ROLE ROLE_PERMISSION PERMISSION (Static)
-------- ----------- --------
id ------------------ role_id
rolename permission_id ----- id
description permission_name
--------- ---------- --------
问题是,权限已经被记录填满,应该是只读的。
如何在没有其他对象且不必将数据存储在静态权限表中的情况下填充角色权限联接表?
我非常感谢一些专家的建议。
最佳答案
这就是我实现它的方法,如果您想要一个一对多的依赖关系或者一个一对多的依赖关系用户->角色,请您自己选择。
所以基本思想是:
在数据库中创建表User&SystemRole,并将条目添加到静态表SystemRole。
确保SystemRole没有用于实例化任何角色的构造函数。
每当您想将任何角色与用户关联时,只需使用一个方法,该方法将输入作为用户名并返回User Role对象。
只需使用一个查询来检索这些细节,我还没有在这里添加这些细节,因为我使用的是使用CrudRepository的Springboot应用程序。
最后,确保依赖项(manytomany/onetoMany)没有级联类型,因为Systemrole已经保存。
用户.java:
import java.util.Set;
import javax.persistence.*;
@Entity
@Table(name = "User")
public class User {
public User() {
}
public User(String name, Set<SystemRole> roles) {
this.name = name;
this.roles = roles;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private boolean enabled;
@ManyToMany
private Set<SystemRole> roles;
public Set<SystemRole> getRoles() {
return roles;
}
public void setRoles(Set<SystemRole> roles) {
this.roles = roles;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Transient
public boolean isEnabled() {
return enabled;
}
@Column(name = "ENABLED")
public int isEnabledasInt() {
return enabled ? 1 : 0;
}
public void setEnabled(int enabled) {
this.enabled = (1 == enabled) ? true : false;
}
}
系统角色.java:
package com.spring.security.model;
import javax.persistence.*;
@Entity
@Table(name = "System_Role")
public class SystemRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private SystemRole() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof SystemRole)) return false;
SystemRole that = (SystemRole) o;
if (getId() != that.getId()) return false;
return getName().equals(that.getName());
}
@Override
public int hashCode() {
int result = getId();
result = 31 * result + getName().hashCode();
return result;
}
}