2012-08-22 142 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