微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。