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 там?

782   2  

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?

вы можете получить аналогичный результат, но с помощью Id on OneToOne или 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.

для записи, поддержка Id on OneToOne и ManyToOne был добавлен в EclipseLink 1.1 (см. этой С Джеймс Сазерленд, eclipselink comitter и главный вкладчик Java Persistence книга Вики). Но позвольте мне настоять, это не часть JPA 1.0.

Я обычно различаю эти два с помощью этой диаграммы:

использовать PrimaryKeyJoinColumn

enter image description here

использовать JoinColumn

enter image description here

Comments

    Ничего не найдено.