Hibernate多个关联问题

时间:2011-03-22 10:48:29

标签: hibernate jpa many-to-many associations

我有 3 个实体。 用户,项目和角色。 可以将用户分配给具有某些角色的多个项目。 用户 GEORGE 可以在 PROJECT-B上的 PROJECT-A MANAGER 角色中拥有 ADMIN 角色/ strong>即可。如何使用双向关联映射这些实体。

*关系可以用以下方式描述。

USER可以通过角色拥有许多项目。

可以为特定用户为0个或多个项目分配角色。*

是否可以使用 JOIN-TABLE

2 个答案:

答案 0 :(得分:1)

如果用户不能在项目中拥有多个角色,只需将@ManyToOne项目映射到您的用户,并将角色关系驻留在您的Project类中。

class User {
     @OneToMany (mappedBy = "projects")
     List<Project> projects;
     [...]
}

class Project {
     @ManyToOne
     User user;
     Role userRole;
     [...]
}

然而,这确实忽略了将多个用户分配到一个项目的可能性,您没有说明,但我认为应该是可能的。

在Google或您最喜爱的搜索引擎上查看Hibernate Annotations是双向的(BI-WINNING!)。

这里没有真正详细说明,看到OP只有29%的接受率..

欢呼

答案 1 :(得分: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