java - 如何将多个字段分配为实体的主键(使用 JPA)

标签 java jpa orm

<分区>

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

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

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

最佳答案

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

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

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

class PersonId {
    int ssn;
    String nationality;
}

ID类反射(reflect)了主键字段,其对象可以表示主键值

关于java - 如何将多个字段分配为实体的主键(使用 JPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16947162/

相关文章:

java - 使用盐散列密码

java - URI 路径不是绝对异常 java(不是 android)

jpa - OneToOne 关系上的 EclipseLink PreUpdate 未持久化

ruby - 使用 EventMachine 进行异步数据库访问

java - Hibernate:指定父实体 <join/> 中的哪一列应使用

java - Android 以编程方式设置 autoLink 属性

java - Servlet 适合复合操作吗?

java - saveorupdate 方法出现重复输入错误

jpa - 如何指定具有 "MEMBER IN"的 JPA 标准 API 以及映射父类(super class)中的多对多关系?

java - JPA实体可以序列化到磁盘吗?