Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @许多并非所有的值都是从DB获得的_Java_Hibernate_Jpa_Many To Many - Fatal编程技术网

Java @许多并非所有的值都是从DB获得的

Java @许多并非所有的值都是从DB获得的,java,hibernate,jpa,many-to-many,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<Authorit

我有在项目中有权限的用户。权限类型存储在数据库中,并与用户建立尽可能多的多对多关系

    @ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_authority", joinColumns = @JoinColumn(name = "uauth_user"), inverseJoinColumns = @JoinColumn(name = "uauth_authority"))
private Set<Authority> userAuthorities;
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=“user\u authority”,joinColumns=@JoinColumn(name=“uauth\u user”),inverseJoinColumns=@JoinColumn(name=“uauth\u authority”))
私人设置用户权限;
但当我尝试获取所选用户的所有权限时,我只获得其中一个权限。Hibernate只需获取其中的第一个并将其放入列表,但忽略用户的所有其他权限


我已经检查了数据库,它存储了这些数据。此外,我还发现了添加一个而不是JPA注释的解决方案。它适用于
@Fetch(FetchMode.SUBSELECT)
,但我仍然不明白它有什么问题。

以下解决方案适用于任何兼容JPA2.0的实现

user
具有主键
id

authority
具有主键
id

user\u authority
包含字段
user\u id
authority\u 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;
@JoinTable(name=“user\u authority”,
joinColumns={@JoinColumn(name=“user\u id”,referencedColumnName=“id”)},
inverseJoinColumns={@JoinColumn(name=“authority\u id”,referencedColumnName=“id”)}
@ManyToMany(fetch=FetchType.EAGER)
私有集授权集;
实体类别权限

@ManyToMany(mappedBy = "authoritySet", fetch = FetchType.EAGER)
private Set<User> userSet;
@ManyToMany(mappedBy=“authoritySet”,fetch=FetchType.EAGER)
私有集用户集;

user\u authority
在JPA中没有实体表示。

Ok问题位于不同的位置

我的错误是,当我尝试使用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。其中只有main有限制。

您将
集合存储在一个集合中。
权限
是否可能彼此相等?否。权限通过id简化了比较方法,该id对于DB中的所有行都是唯一的。它应该可以工作。我刚刚使用EclipseLink和2个实体类User and Authority测试了您的示例。你是如何定义它们的?您是否也定义了实体用户权限(因为您有第三列)?如果是,您是如何定义它的?更新:我已经切换到Hibernate,它也可以工作。