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,其中包含字段idproperty1

在第二个表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的外键引用?

JPA 或 Hibernate 生成(非主键)列值,不是从 1 开始

如何设置在 Java JPA/Hibernate 中不是自动生成的 @Id 主键?

Hibernate/JPA 中的类型安全主键

使用hibernate与spring数据jpa和mysql组成主键