Java 为什么jpa在使用一对多关系时多次查询同一列?

Java 为什么jpa在使用一对多关系时多次查询同一列?,java,jpa,Java,Jpa,我有一些jpa代码,用于持久化具有一组权限的用户。sql中的表有两列,即用户id和权限。但是,当我尝试读取该用户时,生成的sql看起来不太正确。具体而言,这两列被多次选中。下面是一些相关的代码 实体类 @Entity @Table(name="users") public class User implements Storable{ @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="user_id",reference

我有一些jpa代码,用于持久化具有一组权限的用户。sql中的表有两列,即用户id和权限。但是,当我尝试读取该用户时,生成的sql看起来不太正确。具体而言,这两列被多次选中。下面是一些相关的代码

实体类

@Entity
@Table(name="users")
public class User implements Storable{

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="user_id",referencedColumnName="user_id")
    private Set<Permission> permissions;

}

@Entity
@Table(name="permissions")
public class Permission implements Storable{

    @EmbeddedId
    PermissionPK id;

    @MapsId("userId")
    @ManyToOne
    @JoinColumn(name="user_id")
    User user;  
}

@Embeddable
class PermissionPK implements Serializable{
    @Column(name="user_id")
    int userId;
    @Column(name="permission")
    String type;
以下是为查找权限而生成的查询

select
    permission0_.user_id as user2_8_1_,
    permission0_.permission as permissi1_3_1_,
    permission0_.user_id as user2_3_1_,
    permission0_.permission as permissi1_3_0_,
    permission0_.user_id as user2_3_0_ 
from
    permissions permission0_ 
where
    permission0_.user_id=?

我一辈子都搞不懂为什么用户id列被选中了3次,权限列被选中了两次。它最终对我来说没问题,因为我将权限存储在一个集合中,因此重复的权限被删除。但是我想知道为什么它会这样做,这样我就可以解决将来可能无法存储在一个集合中的问题

为什么这个查询会生成重复项?旁注:如果使用自动生成的单列ID,则不会出现问题。而且,正确地进行映射会更容易。您的映射错误:OneToMany关联应该使用mappedBy属性,将其标记为权限中ManyTone的反面。而且它不应该用JoinColumn注释。根据日志,在我看来它是在复制。但是你是对的,当我更全面地测试它时,结果集的行数是正确的。我仍然想知道为什么jpa多次选择同一列的原因。即使在我修复了mappedBy属性之后,它仍然会产生相同的查询。并且用户类的id是自动生成的。我只是没有包括它,因为我认为它不相关。权限实体应该有一个自动生成的单列ID。事实上,所有实体都应该。这将更高效,更容易编码,更容易映射,不需要PK类和可能存在错误的equals和hashCodes,使用单个参数清理URL以通过ID引用给定的权限…谢谢。我没有意识到使用嵌入式ID会导致很多问题。切换到单个列id就成功了
select
    permission0_.user_id as user2_8_1_,
    permission0_.permission as permissi1_3_1_,
    permission0_.user_id as user2_3_1_,
    permission0_.permission as permissi1_3_0_,
    permission0_.user_id as user2_3_0_ 
from
    permissions permission0_ 
where
    permission0_.user_id=?