我有带有@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?
答案 0 :(得分:1)
这只是规范的一部分。 @Entity
始终必须具有@Id
。在此示例中,您甚至不需要(strategy = GenerationType.IDENTITY)
,因为密钥是由父实体提供的(因此,无需使用任何策略来生成它)。
答案 1 :(得分:1)
由于oneof Examples {
Example1 example1 = 1;
Example2 example2 = 2;
}
必须始终具有@Entity
,因此您可以使用以下代码段映射两个实体
@Id