Что произойдет, если я сделаю столбец также 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")
@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. Кто сейчас прав?
Автор использует предварительную версию EclipseLink, совместимую с JPA 2.0 (версия 2.0.0-M7 на момент написания статьи), чтобы написать статью о JPA 1.0 (!). Эта статья вводит в заблуждение, автор использует то, что НЕ является частью JPA 1.0.
Для справки, поддержка Id
on OneToOne
и ManyToOne
была добавлена в EclipseLink 1.1 (см. Это сообщение от Джеймса Сазерленда , разработчика EclipseLink и основного участника вики-книги Java Persistence ). Но позвольте мне настоять на том, что это НЕ часть JPA 1.0.
Я обычно различаю эти два по этой диаграмме:
Использовать
PrimaryKeyJoinColumn
Использовать
JoinColumn
источник
PrimaryKeyJoinColumn
используйте одно и то же значение первичного ключа для объединения двух таблиц, иJoinColumn
первичный ключ основной таблицы станет внешним ключом в другой таблице.Я знаю, что это старый пост, но лучше всего его использовать
PrimaryKeyColumn
, если вам нужны однонаправленные отношения или если несколько таблиц имеют один и тот же идентификатор.В общем, это плохая идея, и было бы лучше использовать отношения внешнего ключа с
JoinColumn
.При этом, если вы работаете со старой базой данных, в которой использовалась подобная система, то сейчас самое время ее использовать.
источник