JPA两个实体使用相同的@JoinTable

时间:2012-08-22 21:41:53

标签: jpa

我有用户有角色,用户有一个组,也可以有角色。我需要一种简单的方法来直接或间接获得用户拥有的所有角色。

我正在考虑这样的事情:

@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);

1 个答案:

答案 0 :(得分:0)

这通常是一个坏主意。

  • 如果User的ID与Group相同,则会发生冲突。
  • 您无法在数据库中使用外键约束。
  • 最终会发生其他奇怪的事情。
  • 在JPA中实现这一点非常困难并且非常容易出错。

RoleGroupRoleUser以及GroupUser之间使用单独的表格。