【问题标题】:How to assign several fields as a primary key of an entity (using JPA) [duplicate]如何将多个字段分配为实体的主键(使用 JPA)[重复]
【发布时间】:2013-06-01 13:55:34
【问题描述】:

可以通过在 JPA 中使用 @Id 注释为其类分配主键。我的问题是,如果不想在他的表中使用自动生成的键并使用字段(可能不止一个)作为主键怎么办。

假设我们有一个包含 SSN、NATIONALITY 和 NAME 的人员表。 SSN 被定义为一个人在他的国家被识别的号码。因此,我们可能在两个不同的国家有两个人数相同的人。此表的主键可以是 SSN+NATIONALITY。有没有办法使用 JPA 映射这两个字段并将其映射到一个对象?或创建自动生成的 id 并使用 @Id 注释的唯一方法

CREATE TABLE PERSON (
     SSN   INT,
     NATIONALITY VARCHAR,
     NAME VARCHAR
  )

【问题讨论】:

  • 感谢您的反馈@femtoRgon。我把它留给社区来决定它是否是重复的。但是,阅读您链接的文章,我注意到它是关于生成 DDL 文件而不是如何注释复合键的基本问题。

标签: java jpa orm


【解决方案1】:

是的,这是可能的。复合主键由多个主键字段组成。每个主键字段必须是 JPA 类型支持的一种。 对于您的表,您有:

@Entity @IdClass(PersonId.class)
public class Person {
    @Id int ssn;
    @Id String nationality;
     ....
}

对于具有多个键的实体,JPA 需要定义一个特殊的 ID 类。此类应使用@IdClass 注解附加到实体类。

class PersonId {
    int ssn;
    String nationality;
}

ID类反映主键字段,其对象可以表示主键值

【讨论】:

  • 第二个选项是使用@EmbeddedId - 一些例子见Oracle TopLink Docs
  • 谢谢@michal。那么,如果我正确理解,第一堂课就能完成这项工作吗?您提到的第二类是针对没有任何复合键的情况,对吗?
  • 第一个类'Person'代表实体。 PersonId 指定映射到实体的多个字段或属性的复合主键类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
相关资源
最近更新 更多