Как назначить несколько полей в качестве первичного ключа сущности (используя JPA) [дубликат]

этот вопрос уже есть ответ здесь:

можно назначить первичный ключ для его класса, используя аннотацию @Id в JPA. Мой вопрос в том, что, если человек не хочет иметь автоматически сгенерированный ключ в своих таблицах и использовать поля (возможно, более одного) в качестве первичного ключа.

предположим, у нас есть таблица person с SSN, национальностью и именем. SSN определяется как число, по которому идентифицируется лицо в его стране. Таким образом, у нас могут быть два человека с одинаковым числом в двух разных странах. Первичным ключом для этой таблицы может быть SSN + NATIONALITY. Есть ли способ сопоставить эти два поля с помощью JPA и сопоставить его с объектом? или единственный способ создать автоматически сгенерированный идентификатор и использовать аннотацию @Id

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

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 отражает поля первичного ключа, а его объекты могут представлять значения первичного ключа