Co się stanie, jeśli wypromuję kolumnę, aby była również / PK (inaczej identyfikującą relację)? Ponieważ kolumna jest teraz PK, muszę oznaczyć ją @Id (...).
Ta ulepszona obsługa identyfikatorów pochodnych jest w rzeczywistości częścią nowej rzeczy w JPA 2.0 (patrz sekcja 2.4.1 Klucze podstawowe odpowiadające tożsamościom pochodnym w specyfikacji JPA 2.0), JPA 1.0 nie zezwala Idna OneToOnelub ManyToOne. W przypadku JPA 1.0 musiałbyś użyć PrimaryKeyJoinColumni zdefiniować Basic Idmapowanie dla kolumny klucza obcego.
Teraz pytanie brzmi: czy @Id + @JoinColumn to to samo, co tylko @PrimaryKeyJoinColumn?
Możesz uzyskać podobny wynik, ale użycie Idon OneToOnelub ManyToOnejest znacznie prostsze i jest preferowanym sposobem mapowania identyfikatorów pochodnych za pomocą JPA 2.0. PrimaryKeyJoinColumnmoże być nadal używany w strategii dziedziczenia POŁĄCZONYCH . Poniżej odpowiednia sekcja ze specyfikacji JPA 2.0:
11.1.40 Adnotacja PrimaryKeyJoinColumn
PrimaryKeyJoinColumnAdnotacji określa kolumnę klucza podstawowego, który jest używany jako klucz obcy do przyłączenia się do innego stolika.
PrimaryKeyJoinColumnAdnotacja jest wykorzystywany do przyłączenia się do pierwotnej tabeli podklasy podmiotem w JOINED
strategii przyporządkowania dla głównej tablicy jego nadrzędnej; jest używany w
SecondaryTableadnotacji do łączenia tabeli dodatkowej z tabelą podstawową; i może być używany w OneToOne
odwzorowaniu, w którym klucz podstawowy obiektu odniesienia jest używany jako klucz obcy do obiektu odniesienia [108] .
...
Jeśli PrimaryKeyJoinColumn
adnotacja nie jest określona dla podklasy w strategii mapowania JOINED, zakłada się, że kolumny klucza obcego mają takie same nazwy, jak kolumny klucza podstawowego tabeli podstawowej nadklasy.
...
Przykład: podklasy Customer i 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] Wyprowadzone mechanizmy identyfikacyjne opisane w sekcji 2.4.1.1 mają być teraz preferowane w
PrimaryKeyJoinColumnprzypadku mapowania OneToOne.
Zobacz też
To źródło http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state stwierdza, że używanie @ManyToOne i @Id działa z JPA 1.x. Kto ma teraz rację?
Autor korzysta z przedpremierowej wersji EclipseLink zgodnej z JPA 2.0 (wersja 2.0.0-M7 w czasie pisania artykułu) do napisania artykułu o JPA 1.0 (!). Ten artykuł jest mylący, autor używa czegoś, co NIE jest częścią JPA 1.0.
Dla przypomnienia , wsparcie dla Idon OneToOnei ManyToOnezostało dodane w EclipseLink 1.1 (zobacz tę wiadomość od Jamesa Sutherlanda , comittera EclipseLink i głównego współautora książki wiki Java Persistence ). Ale pozwól mi nalegać, to NIE jest część JPA 1.0.