JPA: разница между @JoinColumn и @PrimaryKeyJoinColumn? - PullRequest
73 голосов
/ 05 августа 2010

Какая разница между @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?

Ответы [ 2 ]

49 голосов
/ 06 августа 2010

Что произойдет, если я сделаю столбец также / PK (a.k.a. идентифицирующее отношение)? Поскольку столбец теперь является 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 Annotation

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

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

...

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

...

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

@Entity
@Table(name="CUST")
@Inheritance(strategy=JOINED)
@DiscriminatorValue("CUST")
public class Customer { ... }

@Entity
@Table(name="VCUST")
@DiscriminatorValue("VCUST")
@PrimaryKeyJoinColumn(name="CUST_ID")
public class ValuedCustomer extends 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 comitter и main участник книги Java Persistence вики). Но позвольте мне настаивать, это НЕ часть JPA 1.0.

22 голосов
/ 14 февраля 2018

Я обычно различаю эти два с помощью этой диаграммы:

Использование PrimaryKeyJoinColumn

enter image description here

Использование JoinColumn

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...