【问题标题】:How to map JPA Entity with 2 primary keys in Databse如何在数据库中使用 2 个主键映射 JPA 实体
【发布时间】:2014-10-23 08:47:47
【问题描述】:

在我的数据库模型中,我有 2 个主键。我正在将 JPA 与休眠一起使用。

我的数据库模型是这样的


USR_INFO_TBL

COMPANY_ID
PERSONAL_ID
FIRST_NAME
LAST_NAME
电子邮件
USR_INFO_TBL_PK


现在我的 JPA 实体如下所示

 @Entity 
 @Table("USR_INFO_TBL")
 public class UerInfo{
@ID(name ="COMPANY_ID")
private String companyID;

private String personalID;   //what should i write here
@COLUMN(name="firstName") 
private String firstName;

@COLUMN(name="lastName ")
private String lastName;

@COLUMN(name="email")
private String email;

//setters and getters
}

如何将 2 个主键映射到 JPA 实体 你能修改上面的代码吗?我浏览了一些帖子,因为我是 JPA 和 HIBERNATE 概念的新手。我很困惑

谢谢

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    您应该创建一个带有 @Embeddable 注释的类,其中包含复合键的组件,并且在您当前的 User 实体中,您应该使用这种新类型创建一个字段。

    @Entity 
    @Table("INFO_USR_TBL")
    public class User {
        @EmbeddedId
        private UserId id;
    
        @Column(name="firstName") 
        private String firstName;
    
        @Column(name="lastName")
        private String lastName;
    
        @Column(name="email")
        private String email;
    
        //setters and getters
    }
    
    @Embeddable
    public class UserId {
        @Column(name="COMPANY_ID")
        String companyId;
        @Column(name="PERSONAL_ID")
        String personalId;
    }
    

    【讨论】:

    • @Meskobalazs ..通过查看上述数据库模型,我如何知道新的 pojo 类或实体应该使用哪个名称,以及类中应该有哪些字段。其中没有信息..
    • 名称本身无关,字段是主键的组成部分
    • 我们是否需要创建一个单独的类并且应该包含 2 个主键字段。我说的对吗?
    • 但是等等!公司 ID 实际上不是外键?那会更有意义。
    • 谢谢..知道了。我想从数据库中检索一条记录的另一件事。现在我必须在哪个主键上构建我的查询。 select c from USER_INFO_TABLE c where fromId<:c.company_id and toid>:PERSONAL_ID 然后在查询中调用 getSingleResult ..对吗?
    【解决方案2】:

    在 JPA 规范中,它声明“复合主键必须表示和映射为可嵌入类,或者必须表示为 id 类并映射 到实体类的多个字段或属性”。

    您可以将代码更改为以下内容:

    public class UserId {
        String companyId;
        String personalId;
    }
    
    @Entity 
    @Table(name="INFO_USR_TBL")
    @IdClass(UserId.class)
    public class User {
    
        @Id
        @Column(name ="COMPANY_ID")
        private String companyID;
        @Id
        @Column(name ="PERSION_ID")
        private String personalID;
    
        @Column(name="FIRST_NAME") 
        private String firstName;
    
        @Column(name="LAST_NAME")
        private String lastName;
    
        @Column(name="EMAIL")
        private String email;
    
        //setters and getters
    }
    

    【讨论】:

      【解决方案3】:

      请查看这篇文章JPA primary keys,尤其是“复合主键”和“嵌入式主键”段落。我认为,当您需要定义类时,您的案例是“嵌入式主键”,它将包含您实际需要的所有主键部分。

      【讨论】:

      • 我已经浏览了上面的链接..我不明白 2 个实体 pojo 类的概念。我只有一个带有字段的 pojo 类,另一个 java 实体 pojo 是什么?你可以在我的代码之上修改,以便我清楚地了解
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      相关资源
      最近更新 更多