Hibernate-一对多-只获取一条记录正确的次数
下表是为Spring Security定义的。 我想获取所有用户及其所有关联角色。 该表只有一个用户和两个角色(雇员和管理员)的条目。但是,hibernate为AuthorityDO和“Admin”获取两个值。请帮忙 用户表: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 (
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;
}
}