我有项目用户有权限。权限类型存储在数据库中,并与用户链接多对多的关系。
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_authority", joinColumns = @JoinColumn(name = "uauth_user"), inverseJoinColumns = @JoinColumn(name = "uauth_authority"))
private Set<Authority> userAuthorities;
但是当我试图获得所选用户的所有权限时,我只获得其中一个。 Hibernate只是获得第一个并将其列入列表,但忽略了用户的所有其他权限。
我已经检查了数据库并存储了这些数据。我还找到了添加一个而不是JPA注释的解决方案。它适用于@Fetch(FetchMode.SUBSELECT)
,但我仍然不了解它的错误。
答案 0 :(得分:2)
以下解决方案适用于任何符合JPA 2.0的实现。
表user
包含主键id
。
表authority
包含主键id
。
表user_authority
包含字段user_id
,authority_id
。
实体类用户
@JoinTable(name = "user_authority",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "authority_id", referencedColumnName = "id")})
@ManyToMany(fetch = FetchType.EAGER)
private Set<Authority> authoritySet;
实体类权限
@ManyToMany(mappedBy = "authoritySet", fetch = FetchType.EAGER)
private Set<User> userSet;
表user_authority
在JPA中没有实体代表。
答案 1 :(得分:0)
我的错是当我用Hibernate注释尝试它并且它只是工作时我开始认为这是一个注释问题,但实际上它是由获取这个值的方法引起的。
虽然我们在代码中重构了一个错误:
return (T) criteria.setMaxResults(1).uniqueResult();
我将结果的最大计数设置为1,在我们的例子中,它将结果转换为SQL
SELECT * FROM user OUTER JOIN user_authority ON usr_id = uauth_user INNER JOIN authority ON uauth_authority = auth_id LIMIT 1
此限制删除所有权限,并从第一行留下第一个权限。但是当我们将Hibernate FetchMode指定为SUBSELECT时。它在两个单独的SQL查询中执行此get。其中主要有限制。