问题描述
以下表格是为 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?
现在我将尝试将其设置为单向