如何解决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 举报,一经查实,本站将立刻删除。