如何使用 JPA 将一个实体的 Id 设置为另一个实体的 Id?
How to set Id of one entity to the Id of another entity using JPA?
我是 Spring Boot 的 JPA 概念的新手,所以需要您的帮助来决定如何只导入另一个实体的 ID
,比如说 User
到 HealthData
实体。以下是我的 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
}
现在,我希望对这个实体使用 Id
或 User
(建立 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 值。
我是 Spring Boot 的 JPA 概念的新手,所以需要您的帮助来决定如何只导入另一个实体的 ID
,比如说 User
到 HealthData
实体。以下是我的 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
}
现在,我希望对这个实体使用 Id
或 User
(建立 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 值。