Что произойдет, если я сделаю столбец также / 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.