JPA实体中的多对多关系

时间:2012-09-14 08:05:12

标签: jpa many-to-many

我有5张桌子:

用户:

用户名(PK)

作用:

ROLE_ID(PK)
role_name

权限:

perm_id(PK)
perm_name

User_role_rels:

ur_id(PK)
用户名(FK) - > user.username
role_id(FK) - > role.role_id

Role_perm_rels:

rp_id(PK)
role_id(FK) - > role.role_id
perm_id(FK) - > Permissions.perm_id

当我为这五个表创建JPA实体时,我在User实体中获得了UserRoleRels列表,但我需要该用户的权限列表。所以,应该有一个 列出用户实体中的permList。

我是JPA的新手,不知道如何使用注释实现这一目标?

1 个答案:

答案 0 :(得分:0)

由于UserPermission之间没有直接关系,User没有permList集合属性是正确的。

假设您的IDE已根据您的表格正确创建了实体,您的课程中没有ManyToMany个注释,只有OneToManyManyToOne。这使得获取权限集合变得有点麻烦:

String userName = "";
User myUser = entityManager.find(User.class, userName);
for (UserRoleRels urr : myUser.getUserRoleRelsList()) {
    Role r = urr.getRole();
    for(RolePermRels rpr : r.getRolePermRelsList()) {
        Permission p = rpr.getPermission();
    }
}

如果ManyToMany关系表中没有额外的属性(在您的情况下为User_role_relsRole_perm_rels),则可以删除两者的PK字段。这将让您的IDE:(1)创建更简单的实体类,(2)避免为关系表创建实体类,(3)使用ManyToMany注释。通过该更改,您将能够以更易读的方式更轻松地访问权限:

String userName = "";
User myUser = entityManager.find(User.class, userName);
for (Role r : myUser.getRoleList()) {
    List<Permission> pl = r.getPermissionList();
}

有用的链接:EclipseLink UserGuideJPA Wikibooks