gpt4 book ai didi

hibernate - 当实体的主键之间存在关系时,必须在调用save()之前手动分配此类的id

转载 作者:行者123 更新时间:2023-12-01 04:53:48 29 4
gpt4 key购买 nike

我有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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com