JPA:@PrimaryKeyJoinColumn 或@JoinColumn + @Id

JPA: @PrimaryKeyJoinColumn or @JoinColumn + @Id

我的用户 class 带有 @Entity 注释。

@Entity
public class User{

@Id
@GeneratedValue
private Long id;

private String firstName;
private String lastName;

}

我需要创建另一个包含用户详细信息的 table。 它必须链接到 User_id 并且没有它自己的 ID: user_id phone_number address

所以,现在我用这个:

@Entity
@Table
@Data
public class UserDetails{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false)
    private Long id;

    @OneToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    private User user;

    private String address;
    private String phone;
}

但我有一个问题:为什么我使用这个:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private Long id;

如果

@OneToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private User user;

对我来说 user_id?

如果我删除 Id 字段,我会出现错误:没有为实体指定标识符:test.UserDetails,但是嘿! @PrimaryKeyJoinColumn 为此实体创建标识符。

也许我应该使用@Id + @JoinColumn 而不是@PrimaryKeyJoinColumn?

这只是规范的一部分。 @Entity 总是必须有一个 @Id。在此示例中,您甚至不需要 (strategy = GenerationType.IDENTITY),因为密钥是由父实体提供的(因此无需为它的生成使用任何策略)。

由于 @Entity 必须始终有一个 @Id,您可以使用以下代码段来映射两个实体

@Id
@Column(name="user_id")
private Long id;

@OneToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn(name="user_id", referencedColumnName="user_id")
private User user;