Hibernate - 一对多 - 只获取一条记录正确的次数

问题描述

以下表格是为 Spring Security 定义的。 我想获取所有用户及其所有关联角色。 该表只有一个用户和两个角色(员工和管理员)的条目。但是,hibernate 为 AuthorityDO 获取两个值,均为“Admin”。请帮忙。

用户表:

CREATE TABLE users (
  `username` varchar(50) NOT NULL,`password` char(68) NOT NULL,`enabled` tinyint(1) NOT NULL,PRIMARY KEY (`username`)
);

权限表:

CREATE TABLE authorities (
  `username` varchar(50) NOT NULL,`authority` varchar(50) NOT NULL,UNIQUE(username,authority),FOREIGN KEY (username) REFERENCES users(username)
);

用户实体类:

@Entity
@Table(name="users")
public class UserDO {
    @Id
    @Column(name = "username")
    String username;
    @Column(name = "password")
    String password;
    @Column(name = "enabled")
    boolean enabled;
    @OneToMany(fetch = FetchType.LAZY,mappedBy = "userDO")
    List<AuthorityDO> authorities;
    public UserDO() {
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public boolean isEnabled() {
        return enabled;
    }
    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }
    public List<AuthorityDO> getAuthorities() {
        return authorities;
    }
    public void setAuthorities(List<AuthorityDO> authorities) {
        this.authorities = authorities;
    }
}

权威实体类:

@Entity
@Table(name = "authorities",uniqueConstraints = {@UniqueConstraint(columnNames = {"username","authority"})})
public class AuthorityDO {
    @Id
    @Column(name = "username")
    String username;
    @Column(name = "authority")
    String authority;
    @ManyToOne
    @JoinColumn(name = "username",referencedColumnName = "username",insertable = false,updatable = false)
    UserDO userDO;
    public AuthorityDO() {
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getAuthority() {
        return authority;
    }
    public void setAuthority(String authority) {
        this.authority = authority;
    }
    public UserDO getUserDO() {
        return userDO;
    }
    public void setUserDO(UserDO userDO) {
        this.userDO = userDO;
    }
}

代码

public List<UserDO> getUsers() {
        Session currentSession = factory.getCurrentSession();
        Query<UserDO> query = currentSession.createQuery("from UserDO");
        List<UserDO> customers = query.getResultList();
        return customers;
    }

解决方法

我发现了这个问题。我在权限上错误地映射了复合键。这解决了问题。

代码更改:

@Entity
@Table(name = "authorities",uniqueConstraints = { @UniqueConstraint(columnNames = { "username","authority" }) })
public class AuthorityDO {
    @EmbeddedId
    private AuthorityDOCompositeKey compositeKey;
    @ManyToOne
    @JoinColumn(name = "username",referencedColumnName = "username",insertable = false,updatable = false)
    UserDO userDO;

    public AuthorityDO() {
    }

    public AuthorityDOCompositeKey getCompositeKey() {
        return compositeKey;
    }

    public void setCompositeKey(AuthorityDOCompositeKey compositeKey) {
        this.compositeKey = compositeKey;
    }

    public UserDO getUserDO() {
        return userDO;
    }

    public void setUserDO(UserDO userDO) {
        this.userDO = userDO;
    }
}

复合密钥类:

@Embeddable
public class AuthorityDOCompositeKey implements Serializable {
    @Column(name = "username")
    String username;
    @Column(name = "authority")
    String authority;

    public AuthorityDOCompositeKey() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAuthority() {
        return authority;
    }

    public void setAuthority(String authority) {
        this.authority = authority;
    }
}

感谢这个问题:@OneToMany and composite primary keys?

现在我将尝试将其设置为单向

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...