Подтвердить что ты не робот

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

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

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

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

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

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

Теперь возникает вопрос:

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

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

Если нет, для чего @PrimaryKeyJoinColumn для?

4b9b3361

Ответ 1

  Что произойдет, если я продвигаю столбец также как /PK (например, идентифицирующее отношение)? Поскольку столбец теперь является 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 может по-прежнему использоваться в стратегии СОЕДИНЕННОГО наследования. Ниже приведен соответствующий раздел спецификации JPA 2.0:

11.1.40 PrimaryKeyJoinColumn Annotation

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

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

...

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

...

Пример: Клиент и подкласс 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 и основного участника Java Persistence вики-книга). Но позвольте мне настаивать на том, что это НЕ часть JPA 1.0.

Ответ 2

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

Используйте PrimaryKeyJoinColumn

enter image description here

Используйте JoinColumn

enter image description here

Ответ 3

Я знаю, что это старый пост, но хорошее время для использования PrimaryKeyColumn было бы, если бы вы хотели однонаправленные отношения или у вас было несколько таблиц с одинаковым идентификатором.

В общем, это плохая идея, и было бы лучше использовать отношения внешнего ключа с JoinColumn.

Сказав это, если вы работаете с более старой базой данных, в которой использовалась подобная система, то это было бы хорошим временем для ее использования.