你有三个问题
- 缺少从保存
cascade
触发User
实体创建的选项LoginCredential
。 - 由于缺乏
@MapsId
对标注User
,让他们共享相同的ID,否则LoginCredential
,创造了其User
将有不同的ID值两者都有@GeneratedValue(strategy = GenerationType.AUTO)
自己的@Id
列 - 没有设置双方的关系…
为了解决所有问题,您需要将实体更改为以下内容(我还删除了一些无用的注释和值);
@Data@Entitypublic class User { @Id Long userID; @JsonBackReference @MapsId @oneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "userID", referencedColumnName = "userID") @ToString.Exclude private LoginCredential loginCredential;}和
@Data@Entitypublic class LoginCredential { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long userID; String eMail; String passwordHash; @JsonManagedReference @oneToOne(mappedBy = "loginCredential", fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) private User user;}在最终确定端点之前,还需要设置关系的两端;
Optional.ofNullable(loginCredential.getUser()) .ifPresent(user -> user.setLoginCredential(loginCredential));loginCredentialRepo.save(loginCredential);



