JPA: разница между @JoinColumn и @PrimaryKeyJoinColumn?
в чем именно разница между @JoinColumn и @PrimaryKeyJoinColumn?
вы используете @JoinColumn для столбцов, которые являются частью внешнего ключа. Типичный столбец может выглядеть так (например, в таблице соединений с дополнительными атрибутами):
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;
что произойдет, если я продвигаю столбец как A/PK, тоже (a.k.a. идентификация отношений)? Поскольку столбец теперь является PK, я должен пометить его @Id:
@Id
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;
теперь вопрос:
Are @Id + @JoinColumn то же самое, что и просто @PrimaryKeyJoinColumn?:
@ManyToOne
@PrimaryKeyJoinColumn(name = "...")
private OtherClass oc;
если нет, то это @PrimaryKeyJoinColumn там?
2 ответов:
что произойдет, если я продвигаю столбец как A/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и определитьBasicIdсопоставление для столбца внешнего ключа.теперь вопрос: являются ли @Id + @JoinColumn такими же, как и @PrimaryKeyJoinColumn?
вы можете получить аналогичный результат, но с помощью
IdonOneToOneилиManyToOne- это гораздо проще и является предпочтительным способом сопоставления производных идентификаторов с JPA 2.0.PrimaryKeyJoinColumnвсе еще может использоваться в a присоединился стратегия наследования. Ниже соответствующего раздела из спецификации JPA 2.0:11.1.40 PrimaryKeyJoinColumn Аннотации
The
PrimaryKeyJoinColumnаннотация указывает столбец первичного ключа, который используется в качестве внешнего ключа для присоединения другая таблица.The
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.х. Кто теперь исправить?
автор использует предварительный релиз JPA 2.0 совместимая версия EclipseLink (версия 2.0.0-M7 на момент написания статьи) написать статью о JPA 1.0(!). Эта статья вводит в заблуждение, автор использует то, что не часть JPA 1.0.
для записи, поддержка
IdonOneToOneиManyToOneбыл добавлен в EclipseLink 1.1 (см. этой С Джеймс Сазерленд, eclipselink comitter и главный вкладчик Java Persistence книга Вики). Но позвольте мне настоять, это не часть JPA 1.0.


Comments