JPA: разница между @JoinColumn и @PrimaryKeyJoinColumn?

Какова точная разница между @JoinColumn и @PrimaryKeyJoinColumn ?

Вы используете @JoinColumn для столбцов, являющихся частью внешнего ключа. Типичный столбец может выглядеть следующим образом (например, в объединяющей таблице с дополнительными атрибутами):

@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

Что произойдет, если я также переведу столбец в / PK (он же идентифицирует отношение)? Поскольку столбец теперь является PK, я должен пометить его @Id :

@Id
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

Теперь вопрос:

Являются ли @Id + @JoinColumn такими же, как просто @PrimaryKeyJoinColumn ?:

@ManyToOne
@PrimaryKeyJoinColumn(name = "...")
private OtherClass oc;

Если нет, то что такое @PrimaryKeyJoinColumn там для?

74
задан pnuts 3 January 2019 в 13:40
поделиться

1 ответ

Что произойдет, если я сделаю столбец также PK (он же идентифицирующая связь)? Поскольку столбец теперь является ПК, я должен пометить его @Id (...).

Эта расширенная поддержка производных идентификаторов фактически является частью нового материала в JPA 2.0 (см. Раздел 2.4.1 Первичные ключи, соответствующие производным идентификаторам в спецификации JPA 2.0) JPA 1.0 не поддерживает Id на OneToOne или ManyToOne . В JPA 1.0 вам придется использовать PrimaryKeyJoinColumn , а также определить отображение Basic Id для столбца внешнего ключа.

Теперь вопрос: @Id + @JoinColumn - это то же самое, что просто @PrimaryKeyJoinColumn?

Вы можете получить аналогичный результат, но используя Id на OneToOne или ManyToOne намного проще и является предпочтительным способом сопоставления производных идентификаторов с JPA 2.0. PrimaryKeyJoinColumn все еще может использоваться в стратегии наследования JOINED . Ниже соответствующего раздела из спецификации JPA 2.0:

11.1.40 Аннотация PrimaryKeyJoinColumn

Аннотация PrimaryKeyJoinColumn указывает столбец первичного ключа, который используется как внешний ключ для присоединения к другой стол.

Аннотация PrimaryKeyJoinColumn используется для присоединения к основной таблице подкласс сущности в JOINED стратегия сопоставления с основной таблицей своего суперкласса; он используется в SecondaryTable аннотация для присоединения к вторичная таблица к первичной таблице; и его можно использовать в OneToOne отображение, в котором первичный ключ ссылающийся объект используется как внешний ключ к указанному сущность [108].

...

Если нет PrimaryKeyJoinColumn аннотация указана для подкласса в стратегии сопоставления JOINED столбцы внешнего ключа предполагаются иметь те же имена, что и первичный ключ столбцы основной таблицы суперкласс.

...

Пример: Подкласс Customer и ValuedCustomer

 @Entity
@Table (name = "CUST")
@ Наследование (стратегия = ПРИСОЕДИНИЛСЯ)
@DiscriminatorValue ("CUST")
клиент открытого класса {...}

@Организация
@Table (name = "VCUST")
@DiscriminatorValue ("VCUST")
@PrimaryKeyJoinColumn (name = "CUST_ID")
открытый класс ValuedCustomer расширяет Customer {...}

[108] Производные механизмы идентификатора описанные в разделе 2.4.1.1 теперь быть предпочтительнее PrimaryKeyJoinColumn для Случай сопоставления OneToOne.

См. Также


Этот источник http://weblogs.java.net / blog / felipegaucho / archive / 2009/10/24 / jpa-join-table-additional-state утверждает, что использование @ManyToOne и @Id работает с JPA 1.x. Кто теперь прав?

Автор использует предварительную JPA 2.0 совместимую версию EclipseLink (версия 2.0.0-M7 на момент написания статьи) для написания статьи насчет JPA 1.0 (!). Эта статья вводит в заблуждение, автор использует то, что НЕ является частью JPA 1.0.

Для записи, поддержка Id на OneToOne и ManyToOne была добавлена ​​в EclipseLink 1.1 (см. это сообщение от Джеймс Сазерленд , разработчик EclipseLink и основной участник вики-книги Java Persistence ). Но позвольте мне настоять на том, что это НЕ часть JPA 1.0.

49
ответ дан 24 November 2019 в 12:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: