代码之家  ›  专栏  ›  技术社区  ›  Andrea Bevilacqua

JPA/Hibernate:创建一个主键,它是另一个表的主键

  •  2
  • Andrea Bevilacqua  · 技术社区  · 8 年前

    我有一个简单的 User 实体:

    @Entity
    @Table(name = "fdei_user")
    public class User {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        private String login;
    }
    

    我想创建第二个表 UserDetail 带字段 id property1 .

    这是第二张表 用户详细信息 我不希望生成递增的id,但我希望字段 身份证件 都是一样的 身份证件 表中用户的 使用者 ,我希望在获取UserDetail id=1时,也会获取id=1的用户实体。

    @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。。。但什么都没有。。。我总是有错误。

    正确的方法是什么?

    谢谢, 安德莉亚

    2 回复  |  直到 8 年前
        1
  •  2
  •   Lesiak    8 年前
    • 你所寻找的是单向的@OneToOne关系。
    • 两者都需要 @Id 字段和关系( User user )字段。
    • 请注意的用法 @MapsId 确保详细信息表中只有一个键字段。

    我补充了这个答案,因为在评论中没有任何消息来源提到 @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
    }
    
        2
  •  0
  •   Sendi_t    6 年前
    @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)