2016-03-04 47 views
0

我正在開發一個應用程序,用戶可以有一個或多個角色,爲此我決定創建一個映射(中間)表,因此我以UserRoleUserRole這樣的:春天如何管理映射表(多對多)

Mapping Table

在此應用程序用戶有角色(一個或多個)決定wheneaver他可以訪問特定觀點或行動的前端。我唯一需要的是檢索用戶的角色並添加/刪除它們。 JPA工具製作的,他下面我EJB(簡體):我使用的是EJB創建POJO針對前端

用戶

/** 
* 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; 
    } 

} 

USER_ROLE

/** 
* 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; 
    } 

} 

在我的項目。當我詢問一個給定的用戶角色的完整列表,我應該如何去這樣做:

  1. 創建使用CrudRepository有梅託德一個UserRole的倉庫就像 List<RolUsuario> findByUsuario(Usuario user);
  2. 返回的UserRole列表我User Service並且通過 列表將每個角色提取到一個UserPOJO

  3. 發送到前端。

或者是有什麼辦法只得到了蝙蝠的權利的Roles名單表UserRole其中User(同上)=什麼?

這對我來說很難描述。我的應用程序只關心用戶的角色,而不是映射表實體,所以botton行是我必須得到它們,但我不知道從哪裏開始。

任何指針都會非常有用。

編輯:

我也可以......

  1. 新角色除了用戶創建的UserRole。
  2. 將UserRole添加到用戶列表中。
  3. 要獲取用戶的角色,請改爲使用UserRolelist。
+0

一種選擇是沒有UserRole的模式,但僅具有用戶和角色。您可以指定用戶具有角色列表,並在角色表中具有用戶列表。 –

+0

以下是一個示例:http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example-annotation/ –

+0

問題是中間表可能有一天會成爲一個實體。 –

回答

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; 
+0

對不起,我正在一個西班牙國家學習,所以我有時忘記切換它們。現在已經很晚了,所以明天我會試試這個,只是一個問題。這是否意味着擺脫中間表?就像去sqlWorkbench並刪除所述表並添加新的多對多關係一樣? –

+0

@CodeGrasshopper編號Hibernate將創建一個「多對多」關係的連接表。您可以使用'@ JoinTable'註釋來指定它的名稱和列名稱。 –

+0

@CodeGrasshopper你可以參考[這個答案](http://stackoverflow.com/a/35790542/3405171)瞭解一個'@ JoinTable'的例子。但是,也許,你不需要使用這樣複雜的東西(不需要指定約束名稱)。 –

1

UserrolUsuarios列表中的角色。在您的User服務中,查找用戶,通常使用id。如果您有idUsuario,那麼用戶EntityManger.find(Usuario.class, idUsuario),並且您可以通過getRolUsuarios讀取用戶角色,或者至少這是執行此操作的典型方法。

在您的表格設計中,您有一個用於user_role表(iduserrole)的id,這對於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_RoleJoin Table。連接表將包含用戶的每個id和其中的角色表,僅此而已。

編輯:roles更改爲ManyToMany,否則將約束條件添加到數據庫,這將阻止將Role添加到多個用戶。通常情況下,角色表中只有唯一角色,例如USER,ADMIN等,因此您希望能夠將其分配給多個用戶。

這是你在找什麼?

+0

看起來'User'和'Role'應該有'多對多'關係。 –

+0

查看上面的修改。 –

+0

「多對多」意味着兩個用戶可以具有「ADMIN」角色,例如。它與典型的角色表只有唯一角色_這一事實並不矛盾。 –