JPA:@PrimaryKeyJoinColumn或@JoinColumn + @Id

时间:2019-03-13 11:10:40

标签: java spring hibernate spring-boot jpa

我有带有@Entity批注的用户类。

@Entity
public class User{

@Id
@GeneratedValue
private Long id;

private String firstName;
private String lastName;

}

我需要用用户详细信息创建另一个表。 它必须链接到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?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

由于oneof Examples { Example1 example1 = 1; Example2 example2 = 2; } 必须始终具有@Entity,因此您可以使用以下代码段映射两个实体

@Id