【发布时间】:2022-11-10 15:31:57
【问题描述】:
我正在使用 Springboot 和 JPA 创建两个共享相同主键的表。
对于我写的第一张表:
public class UserAccount implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(mappedBy ="user", cascade = {CascadeType.REMOVE, CascadeType.MERGE,
CascadeType.REFRESH}, fetch=FetchType.LAZY)
@PrimaryKeyJoinColumn
private UserLogin login;
}
对于我写的第二张表:
public class UserLogin implements Serializable
{
@Id
private Long user_id;
@OneToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH},
fetch=FetchType.LAZY)
@MapsId("user_id")
@JoinColumn(name = "user_id", referencedColumnName = "id")
@Setter(AccessLevel.NONE)
private UserAccount user;
public void setUser(UserAccount user)
{
this.user = user;
this.user_id = user.getId();
}
}
为简洁起见,省略了其他内容。该代码有效,因为我通过编写语句手动设置了 UserLogin 的 id
this.user_id = user.getId();
否则我得到错误:
休眠错误:必须在调用 save() 之前手动分配此类的 id:
我猜想可以手动管理 id,但我无法获得正确的配置。
更新: 我找到了解决方案,谢谢(请参阅接受的答案)。现在我只是在设置用户登录时摆脱 findById() 。
//these methods are defined within a dedicated @Service @Transactional public void createLoginInfo(UserAccount user) { UserLogin userlogin=new UserLogin(); this.addLoginToUser(userlogin,user); loginService.save(userlogin); } @Transactional public void addLoginToUser(UserLogin login, UserAccount account) { //whit this commented line works //UserAccount acc= this.findById(account.getId()); login.setUser(account); account.setLogin(login); } //In a transactional test method I first create the user then I call userService.save(theuser); userService.createLoginInfo(theuser);
【问题讨论】:
标签: spring-boot jpa spring-data-jpa