Spring如何管理映射表(多对多)

时间:2016-03-04 05:40:25

标签: java spring hibernate jpa

我正在开发一个用户可以拥有一个或多个角色的应用程序,为此我决定创建一个映射(中间)表,因此我以UserRole和{{1像这样:

Mapping Table

在这个应用程序中,用户拥有的角色确定他可以访问前端中的某些视图或操作。我唯一需要的是检索用户拥有的角色并添加/删除它们。 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。当我要求给定用户的完整角色列表时,我应该如何执行此操作:

  1. 使用带有类似方法的CrodRepository创建一个UserRole存储库 /** * 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; } }
  2. List<RolUsuario> findByUsuario(Usuario user);的列表返回到我的UserRole并查看 列表将每个角色提取为User Service

  3. 发送至前端。

  4. 或者,有没有办法直接在UserPOJO RolesUserRole中找到User(Id?)=某事?

    这对我来说很难描述。我的应用程序只关心用户的角色,而不是映射表实体,所以botton线是我不得不得到它们但我不知道从哪里开始。

    任何指针都非常有用。

    编辑:

    或者我可以......

    1. 创建UserRole以向用户添加新角色。
    2. 将UserRole添加到用户内的列表。
    3. 要获取用户的角色,请改为使用UserRolelist。

2 个答案:

答案 0 :(得分:1)

UserrolUsuarios列表中的角色。在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添加到多个用户。通常,角色表中只包含唯一的角色,例如USERADMIN等,因此您希望能够将它们分配给多个用户。

这是你在找什么?

答案 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;