【问题标题】:Hibernate Multiple Association IssueHibernate 多重关联问题
【发布时间】:2011-03-22 10:48:29
【问题描述】:
我有 3 个实体。 用户、项目和角色。
可以将一个用户分配给具有某些角色的多个项目。
用户 GEORGE 可以在 PROJECT-A 上拥有 ADMIN 角色,在 PROJECT-BMANAGER 角色/强>。如何使用双向关联映射这些实体。
*关系可以用以下方式描述。
一个用户可以通过一个角色拥有多个项目。
一个角色可以分配给特定用户的 0 个或多个项目。*
是否可以使用 JOIN-TABLE。
【问题讨论】:
标签:
hibernate
jpa
many-to-many
associations
【解决方案1】:
您需要引入第四个实体(我们称之为Right),它告诉特定用户在特定项目中具有特定角色。因此,您将以以下关联结束:
- 一个用户拥有多项权利
- 一个角色有很多权利
- 一个项目有很多权利
RIght 实体将映射到具有三个外键(用户、角色和项目)的表,并且元组 (userId, projectId, roleId) 应该是唯一的。
您需要使用专用查询(或 Java 方法)来查找用户在项目中的角色:
public class User {
// ...
public Set<Role> getRolesForProject(Project project) {
Set<Role> result = new HashSet<Role>();
for (Right right : rights) {
if (right.getProject().equals(project)) {
result.add(right.getRole());
}
}
return result;
}
}
或者,在 HQL 中:
select role from Right right
inner join right.role role
where right.user = :user
and right.project = :project
【解决方案2】:
如果用户不能在一个项目中拥有多个角色,只需将@ManyToOne Projects 映射到您的用户,并将角色关系驻留在您的项目类中。
class User {
@OneToMany (mappedBy = "projects")
List<Project> projects;
[...]
}
class Project {
@ManyToOne
User user;
Role userRole;
[...]
}
但是,这确实忽略了将多个用户分配给一个项目的可能性,您没有说明,但我认为应该是这种可能性。
只需在 google 或您最喜欢的搜索引擎上查找 Hibernate Annotations an Bi-directional (BI-WINNING!)。
这里就不详细说了,看到OP只有29%的接受率..
干杯