Ответ 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.