Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Hibernate-一对多-只获取一条记录正确的次数_Hibernate_One To Many_Hibernate Onetomany - Fatal编程技术网

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

Hibernate-一对多-只获取一条记录正确的次数,hibernate,one-to-many,hibernate-onetomany,Hibernate,One To Many,Hibernate Onetomany,下表是为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 (

下表是为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;
    }
}
代码

公共列表getUsers(){
会话currentSession=factory.getCurrentSession();
Query Query=currentSession.createQuery(“来自UserDO”);
List customers=query.getResultList();
返回客户;
}

我发现了问题。我在权威机构上错误地映射了复合密钥。这就解决了问题

代码更改:

@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;
    }
}
多亏了这个问题:

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

@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;
    }
}