JPA 上的单向惰性@OneToOne @MapsId

问题描述 投票:0回答:1

我有 2 个实体 User 和 Doctor,正如你可能猜到的,我的想法是在它们之间建立 OneToOne 关系,我的步骤是首先创建一个 User,然后在激活 User 后,创建一个 Doctor 作为主键,激活用户的外键。

我正在寻找创建一个不包含进程中的对象用户的医生,因为用户已经创建了。

代码如下:

@Entity
@Data
public class User {
    @Id
    private String id;
    @Column(unique=true)
    private String email;
    private String phone;
    private String password;
    @Enumerated(EnumType.STRING)
    private Authorities authority;
    private boolean active;
    private String activationKey;
}
@Entity
@Data
public class Doctor {
    @Id
    private String id;
    @OneToOne(fetch = FetchType.LAZY)
    @MapsId
    private User user;
    private String name;
    private String address;
}

然后,创建一个用户

{
    "id": "3",
    "email": "[email protected]",
    "phone": "phone",
    "password": "password",
    "authority": "DOCTOR"
}

激活后,尝试创建一个Doctor

{
    "id": "3",
    "name": "Third User",
    "address": "address",
    "newPassword": "newPassword"
}

但是,导致错误

"org.springframework.orm.jpa.JpaSystemException: attempted to assign id from null one-to-one property [com.example.demo.domain.Doctor.user]

我一直在尝试更改 OneToOne 的加载类型,并在保存时将用户设置为 null,但仍然不起作用。

spring jpa entity-relationship one-to-one
1个回答
0
投票

首先为用户属性添加@JoinColumn(name = "user_id"),然后不要尝试直接设置Doctor的ID,而是先检索User实体,然后将其设置在Doctor对象中,然后保存。

© www.soinside.com 2019 - 2024. All rights reserved.