2012-08-22 169 views
0

我有用戶有角色和用戶有一個組,也可以有角色。我需要一種簡單的方法來獲得用戶直接或間接的所有角色。JPA兩個實體使用相同@JoinTable

我想是這樣的:

@Entity 
@Table(name = "USER") 
public class User{ 
@Id 
private Integer id; 
@OneToMany 
@JoinTable(name = "USER_ROLES", joinColumns = @JoinColumn(name = "USER_ID"), 
inverseJoinColumns = @JoinColumn(name = "ROLE_ID") ) 
private List<Roles> roles; 
@ManyToOne 
private List<Group> group; 
} 

@Entity 
@Table(name = "GROUP") 
public class Group{ 
@Id 
private Integer id; 
@OneToMany 
@JoinTable(name = "USER_ROLES", joinColumns = @JoinColumn(name = "GROUP_ID"), 
inverseJoinColumns = @JoinColumn(name = "ROLE_ID") ) 
private List<Roles> roles; 
} 

@Entity 
@Table(name = "ROLE") 
public class Role{ 
@Id 
private Integer id; 
@Column 
private String name; 
} 

...但這樣一來,我需要兩個步驟:首先,我可以得到直接的角色,然後間接角色,我需要合併兩個集合。有沒有更簡單或更方便的方法?

從SQL它會很容易這樣做:

USER  USER_ROLES ROLE 
----  ---------- ---- 
ID  USER_ID  ID 
GROUP_ID GROUP_ID NAME 
      ROLE_ID 

SELECT * 
FROM USER u 
JOIN USER_ROLES u_r ON (u.ID = u_r.USER_ID) 
JOIN USER_ROLES g_r (u.GROUP_ID = u_r.GROUP_ID); 
+0

您提到,從SQL中很容易,但這基本上是一個查詢。你可以用JPQL做同樣的事情。但是你不能以這種方式構建表,所以你不能以這種方式構建你的實體。想象一下現在從實體生成表格的過程。 – JMelnik

回答

0

這通常是一個壞主意。

  • 如果UserGroup的ID相同,則會有衝突。
  • 你不能在你的數據庫中使用外鍵約束。
  • 其他奇怪的事情最終會發生。
  • 在JPA中執行此操作非常困難且非常容易出錯。

使用RoleGroupRoleUserGroupUser間單獨的表。

+0

也許我不清楚:用戶和組不使用相同的ID - 他們都有他們的。在連接表(USER_ROLES)中,有單獨的USER_ID和GROUP_ID以及ROLE_ID。在映射中他們有不同的@JoinColumns。很抱歉,此設置旨在針對簡化的SQL使用進行優化。但我對任何解決核心問題的方法都是開放的:我有兩個實體(User和Group)引用同一個第三實體(Role);組有很多用戶;在大多數情況下,我需要查詢用戶的所有直接和間接角色。我需要在JPA或Hibernate中爲此進行優化設置。 – BTakacs

+0

如果你有一個包含3列('role_id','user_id'和'group_id')的連接表,你不能執行唯一的約束,因爲'user_id'或'group_id'都是NULL。這很容易出錯,而不是規範化的數據庫設計。去分開的連接表。 – siebz0r