Що станеться, якщо я також висуну колонку як / ПК (також ідентифікуючу зв'язок)? Оскільки стовпець тепер 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
PrimaryKeyJoinColumn
Анотацій визначає стовпець первинного ключа , який використовується в якості зовнішнього ключа , щоб приєднатися до іншого столу.
PrimaryKeyJoinColumn
Анотацій використовується для з'єднання основної таблиці підкласу об'єкта в JOINED
стратегії відображення на основній таблиці суперкласу; він використовується в
SecondaryTable
анотації для приєднання вторинної таблиці до первинної; і він може бути використаний у OneToOne
відображенні, в якому первинний ключ сутності посилання використовується як зовнішній ключ сутності, на яку посилається [108] .
...
Якщо жодна PrimaryKeyJoinColumn
анотація не вказана для підкласу в стратегії зіставлення JOINED, передбачається, що стовпці зовнішнього ключа мають ті самі імена, що і стовпці первинного ключа первинної таблиці суперкласу.
...
Приклад: підклас "Клієнт" та "Оцінений клієнт"
@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
на OneToOne
і ManyToOne
була додана в EclipseLink 1.1 (див це повідомлення від Джеймса Сазерленда , EclipseLink comitter і основний внесок в Java Persistence вікі книги). Але дозвольте мені наполягати, це НЕ є частиною JPA 1.0.