@ManyToMany并非从DB获得的所有值

时间:2012-02-22 12:08:07

标签: java hibernate jpa many-to-many

我有项目用户有权限。权限类型存储在数据库中,并与用户链接多对多的关系。

    @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),但我仍然不了解它的错误。

2 个答案:

答案 0 :(得分:2)

以下解决方案适用于任何符合JPA 2.0的实现。

user包含主键id

authority包含主键id

user_authority包含字段user_idauthority_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。其中主要有限制。