我正在开发一个用户可以拥有一个或多个角色的应用程序,为此我决定创建一个映射(中间)表,因此我以User
,Role
和{{1像这样:
在这个应用程序中,用户拥有的角色确定他可以访问前端中的某些视图或操作。我唯一需要的是检索用户拥有的角色并添加/删除它们。 JPA Tools创建了他跟随EJB(简化):
用户
UserRole
USER_ROLE
/**
* The persistent class for the usuario database table.
*
*/
@Entity
@NamedQuery(name="Usuario.findAll", query="SELECT u FROM Usuario u")
public class Usuario implements Serializable {
private static final long serialVersionUID = 1L;
private int idUsuario;
private List<RolUsuario> rolUsuarios;
public Usuario() {
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int getIdUsuario() {
return this.idUsuario;
}
public void setIdUsuario(int idUsuario) {
this.idUsuario = idUsuario;
}
//bi-directional many-to-one association to RolUsuario
@OneToMany(mappedBy="usuario")
public List<RolUsuario> getRolUsuarios() {
return this.rolUsuarios;
}
public void setRolUsuarios(List<RolUsuario> rolUsuarios) {
this.rolUsuarios = rolUsuarios;
}
public RolUsuario addRolUsuario(RolUsuario rolUsuario) {
getRolUsuarios().add(rolUsuario);
rolUsuario.setUsuario(this);
return rolUsuario;
}
public RolUsuario removeRolUsuario(RolUsuario rolUsuario) {
getRolUsuarios().remove(rolUsuario);
rolUsuario.setUsuario(null);
return rolUsuario;
}
}
在我的项目中,我使用EJB为前端创建POJO。当我要求给定用户的完整角色列表时,我应该如何执行此操作:
/**
* The persistent class for the rol_usuario database table.
*
*/
@Entity
@Table(name="rol_usuario")
@NamedQuery(name="RolUsuario.findAll", query="SELECT r FROM RolUsuario r")
public class RolUsuario implements Serializable {
private static final long serialVersionUID = 1L;
private int idRol_Usuario;
private Usuario usuario;
private Rol rol;
public RolUsuario() {
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int getIdRol_Usuario() {
return this.idRol_Usuario;
}
public void setIdRol_Usuario(int idRol_Usuario) {
this.idRol_Usuario = idRol_Usuario;
}
//bi-directional many-to-one association to Usuario
@ManyToOne(fetch=FetchType.LAZY)
public Usuario getUsuario() {
return this.usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
//bi-directional many-to-one association to Rol
@ManyToOne(fetch=FetchType.LAZY)
public Rol getRol() {
return this.rol;
}
public void setRol(Rol rol) {
this.rol = rol;
}
}
将List<RolUsuario> findByUsuario(Usuario user);
的列表返回到我的UserRole
并查看
列表将每个角色提取为User Service
发送至前端。
或者,有没有办法直接在UserPOJO
Roles
表UserRole
中找到User
(Id?)=某事?
这对我来说很难描述。我的应用程序只关心用户的角色,而不是映射表实体,所以botton线是我不得不得到它们但我不知道从哪里开始。
任何指针都非常有用。
编辑:
或者我可以......
答案 0 :(得分:1)
User
和rolUsuarios
列表中的角色。在User
服务中,通常使用id
查找用户。如果你有idUsuario
,那么用户EntityManger.find(Usuario.class, idUsuario)
,您可以按getRolUsuarios
阅读用户角色,或者至少这是典型的方式。
在您的表格设计中,您有一个id
用于user_role表(iduserrole),这对于join table
来说并不常见。通常,您只需使用OneToMany
注释创建实体,并为您创建join table
:
@Entity
public class User {
@Id @GeneratedValue private Long id;
@ManyToMany
Set<Role> roles;
}
和
@Entity
public class Role {
@Id @GeneratedValue private Long id;
}
这两个类将创建三个表,User
表,Role
表和User_Role
Join Table
。连接表将包含用户的每个id和其中的角色表,仅此而已。
编辑:roles
更改为ManyToMany
,否则将向数据库添加一个约束,以防止将Role
添加到多个用户。通常,角色表中只包含唯一的角色,例如USER
,ADMIN
等,因此您希望能够将它们分配给多个用户。
这是你在找什么?
答案 1 :(得分:1)
您的用户和角色架构并不常用。我建议您从用户到角色建立@ManyToMany
关联。如果您需要将连接表映射到实体(不太可能),您可以稍后再执行。并且,请使用英语标识符和Java命名约定(idRol_Usuario
)。它会帮助你和其他人。
@Entity
@Table
public class User {
@Id
@GeneratedValue
private Long pid;
@ManyToMany(fetch = FetchType.LAZY)
private List<Role> roles;
}
@Entity
@Table
public class Role {
@Id
private Long pid;
@Column
private String name;
}
您也可以使用Set<Role>
@ManyToMany(fetch = FetchType.LAZY)
private Set<Role> roles;