如何使用 JPA 将一个实体的 Id 设置为另一个实体的 Id?

How to set Id of one entity to the Id of another entity using JPA?

我是 Spring Boot 的 JPA 概念的新手,所以需要您的帮助来决定如何只导入另一个实体的 ID,比如说 UserHealthData实体。以下是我的 User 实体:

@Entity
@Table(name = "user",uniqueConstraints = {@UniqueConstraint(columnNames = "email")})
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;
    @Email
    @Column(nullable = false)
    private String email;

    private String imageUrl;
    @Column(nullable = false)
    private Boolean emailVerified=false;
    @JsonIgnore
    private String password;
    @NonNull
    @Enumerated(EnumType.STRING)
    private AuthProvider authProvider;
    private String providerId;
}

我希望按以下方式定义 HealthData 实体:

@Entity
@Table(name = "HealthData",uniqueConstraints = {@UniqueConstraint(columnNames = "id")})
public class HealthData {
    @Id
    private Long id; //how to import id of User here?

    @Column
    private Double height;
    @Column
    private Double weight;
    @Column
    private int age;
    ...other columns

}

现在,我希望对这个实体使用 IdUser(建立 parent-child 关系)。我不想在 HealthData 中添加 User class object。我想在 HealthData 中使用 @OneToOne,但它会在其中添加 User。我怎样才能在 child table 中包含来自 parent table 的 ID?

在这种情况下,您的 HealthData 引用了 User,我不确定您为什么不将其映射为外键。如果你能做到,我建议如下:

@Entity
@Table(name = "HealthData")
public class HealthData {
    @Id
    @OneToOne
    @JoinColumn(name = "id")
    private User user; 

    @Column
    private Double height;
    @Column
    private Double weight;
    @Column
    private int age;
    ...other columns
}

JPA 然后为您处理将“ID”设置为您的用户实例中的值,并且可以自动将两者保留在同一事务中。允许将引用标记为 ID 被称为派生 ID,我相信自 JPA 2.0 以来就支持它。

至于效率,你还是可以懒取甚至不取用户实例。使用稍微不同的方法将 ID 列映射为基本列很简单:

@Entity
@Table(name = "HealthData")
public class HealthData {
    @Id
    private Long id;
    
    @MapsId
    @OneToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "id")
    private User user; 

    @Column
    private Double height;
    @Column
    private Double weight;
    @Column
    private int age;
    ...other columns
}

JPA 将根据它在您设置 healthData.user 引用时为用户 ID 序列生成的内容设置用户 ID 和 healthData.id 值。