【发布时间】:2021-04-06 22:21:38
【问题描述】:
我正在尝试创建双向 OneToMany 关系,
其中一个外键是复合主索引的一部分。
我目前有这个架构:
CREATE TABLE users
(
id INTEGER UNIQUE AUTO_INCREMENT,
PRIMARY KEY (id)
);
CREATE TABLE user_roles
(
name VARCHAR(16) NOT NULL,
userId INTEGER,
PRIMARY KEY (userId, name),
FOREIGN KEY (userId) REFERENCES users (id)
);
我想在休眠中表示它。
我的 UserEntity 被映射:
@Entity
@Table(name = "users")
public class UserEntity implements User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "id.userId")
List<UserRoleEntity> roles;
@Override
public Integer getId() {
return id;
}
@Override
public List<String> getRoles() {
return roles.stream()
.map(UserRoleEntity::getName)
.collect(Collectors.toList());
}
public void setId(Integer id) {
this.id = id;
}
public void setRoles(List<UserRoleEntity> roles) {
this.roles = roles;
}
}
还有我的 UserRoleEntity:
@Embeddable // I haven't yet implemented hashcode etc
class UserAndRoleNameUniqueId implements Serializable {
protected Integer userId;
protected String name;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
@Table(name = "user_roles")
public class UserRoleEntity {
@EmbeddedId
protected UserAndRoleNameUniqueId id = new UserAndRoleNameUniqueId();
@ManyToOne
@MapsId("userId")
protected UserEntity user;
public void setUserId(Integer userId) {
this.id.userId = userId;
}
public Integer getUserId() {
return user.getId();
}
public void setUser(UserEntity user) {
this.user = user;
}
public String getName() {
return id.name;
}
public void setName(String name) {
this.id.name = name;
}
}
我通过以下方式保存 UserEntity 对象:
var userEntity = new UserEntity();
userEntity.setRoles(
user.getRoles().stream().map(role -> {
var userRoleEntity = new UserRoleEntity();
userRoleEntity.setName(role);
return userRoleEntity;
}).collect(Collectors.toList())
);
sessionFactory.getCurrentSession().save(userEntity);
return userEntity;
我得到Caused by: java.sql.SQLException: Unknown column 'userroleen_.user_id' in 'field list'
我怎样才能修复它并以简单的方式实现这种映射?
【问题讨论】:
标签: java mysql hibernate foreign-keys composite-primary-key