Какова точная разница между @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
там для?
Что произойдет, если я сделаю столбец также 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.