我有2个实体,我要在它们之间创建一个关系,使它们都共享其主键。当我们提交一个实体时,另一个实体也应使用为第一个实体生成的相同主键来提交。
我的第一个实体是用户
@Entity
@Table(name = "ENDUSER")
public class User extends LongIdBase implements IActivatable, IUser {
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@OneToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, targetEntity = UserLoginRecord.class)
@PrimaryKeyJoinColumn(name = "id")
private UserLoginRecord userLoginRecord;
我的第二个实体是UserLoginrecord
@Entity
@Table(name = "ENDUSER_TEMP")
public class UserLoginRecord {
@Id
@Column(name = "id")
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "name")
private String name;
我希望当我保留user时,还应使用与User相同的主目录创建UserLoginRecord的新行。
但是,在尝试坚持时,我在下面收到此错误。
ids for this class must be manually assigned before calling save():
最佳答案
之所以会出现该错误,是因为除非指定标识符生成器,否则将假定使用“已分配”生成器。分配的标识符希望您手动设置ID,因此我认为您对自动生成ID感兴趣。
尝试将其更改为:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
用户应该是用户/ userLoginRecord关联的所有者,因此:
@Entity
@Table(name = "ENDUSER")
public class User extends LongIdBase implements IActivatable, IUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
}
我认为用户可以拥有更多的UserLoginRecords,这意味着用户将与UserLoginRecord具有一对多关联,而UserLoginRecord将与User具有多对一关联。
假设您与用户和UserLoginRecord之间存在一对一关系
UserLoginRecord看起来像:
@Entity
@Table(name = "ENDUSER_TEMP")
public class UserLoginRecord {
@Id
@Column(name="userId", unique=true, nullable=false)
private Long userId;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="userId")
@MapsId
private User user;
对于双向一对一关联,用户还可以包含:
@OneToOne(mappedBy = "user")
private UserLoginRecord userLoginRecord;
如果您要进行双向关联,请不要忘记在保存之前设置双方:
user.setUserLoginRecord(userLoginRecord);
userLoginRecord.setUser(user);
即使userLoginRecord.user端是此关联的所有者,而user.userLoginRecord则是“反向”端。
关于hibernate - 当实体的主键之间存在关系时,必须在调用save()之前手动分配此类的id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24697561/