JPA / Hibernate:创建一个主键,它是另一个表的主键
Posted
技术标签:
【中文标题】JPA / Hibernate:创建一个主键,它是另一个表的主键【英文标题】:JPA / Hibernate: create a primary key which is a primary key of another table 【发布时间】:2018-02-12 12:05:26 【问题描述】:我有这个简单的User
实体:
@Entity
@Table(name = "fdei_user")
public class User
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String login;
我想创建第二个表UserDetail
,其中包含字段id
和property1
。
在第二个表UserDetail
中,我不希望生成递增的 id,但我希望字段 id
与表 User
中用户的 id
相同,我希望当我获取了 UserDetail id=1,同时获取了 id=1 的 User 实体。
@Entity
@Table(name = "fdei_user_details")
public class UserDetails
@Id
@OneToOne
@PrimaryKeyJoinColumn(name="id", referencedColumnName="id")
private User id;
private Boolean property1;
我怎样才能意识到这一点? 我尝试了@OneToOne、@PrimaryKeyJoinColumn、@MapsId...但什么都没有...我总是有错误。
什么是正确的方法?
非常感谢, 安德烈亚
【问题讨论】:
JPA: Foreign key that is also a primary key mapping的可能重复 您可以参考THIS 【参考方案1】: 您正在寻找的是单向@OneToOne 关系。 您需要@Id
字段和关系 (User user
) 字段。
请注意@MapsId
的用法,确保明细表中只有一个关键字段。
我添加了这个答案,因为在 cmets 中发布的资源都没有提到 @MapsId
@Entity
@Table(name = "fdei_user_details")
public class UserDetails
@Id
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@MapsId
@OneToOne
@JoinColumn(name = "id", referencedColumnName = "id")
private User user;
private Boolean property1;
// getters and setters
【讨论】:
当我尝试在 UserDetails 中添加记录时,即使验证了字段“id”,Hibernate 也会出现错误:“null identifier”。任何的想法?谢谢 如何设置id
?使用此设置,我认为您需要设置 user
字段。
当我持久化一个 UserDetails 行时,我在 User 表中设置了具有现有 id 的“Long id”,并且还设置了具有相同“Long id”的 user.setId().. .
我相信这是过于复杂的事情。只需在新的UserDetails
对象中设置user
字段即可。用户必须附加到上下文。用户 u1 = userRepository.findOne(1L);用户详细信息 ud = new UserDetails(); ud.setUser(u1); userDetailsRepository.save(ud);
已解决:@Id private Long id; @OneToOne @PrimaryKeyJoinColumn private User user;
不带 @OneToOne
和不带 @MapsId
【参考方案2】:
@Entity
@Table(name = "fdei_user_details")
public class UserDetails
@Id
@MapsId
@OneToOne
@JoinColumn(name = "id")
private User user;
private Boolean property1;
// getters and setters
您可以在映射本身上注释 @Id (JPA 2.0)
【讨论】:
以上是关于JPA / Hibernate:创建一个主键,它是另一个表的主键的主要内容,如果未能解决你的问题,请参考以下文章
使用JPA和Hibernate提供程序的ManyToMany关系不会创建主键
JPA 或 Hibernate 生成(非主键)列值,不是从 1 开始