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 Id
na OneToOne
lub ManyToOne
. W przypadku JPA 1.0 musiałbyś użyć PrimaryKeyJoinColumn
i zdefiniować Basic
Id
mapowanie dla kolumny klucza obcego.
Teraz pytanie brzmi: czy @Id + @JoinColumn to to samo, co tylko @PrimaryKeyJoinColumn?
Możesz uzyskać podobny wynik, ale użycie Id
on OneToOne
lub ManyToOne
jest znacznie prostsze i jest preferowanym sposobem mapowania identyfikatorów pochodnych za pomocą JPA 2.0. PrimaryKeyJoinColumn
może być nadal używany w strategii dziedziczenia POŁĄCZONYCH . Poniżej odpowiednia sekcja ze specyfikacji JPA 2.0:
11.1.40 Adnotacja PrimaryKeyJoinColumn
PrimaryKeyJoinColumn
Adnotacji określa kolumnę klucza podstawowego, który jest używany jako klucz obcy do przyłączenia się do innego stolika.
PrimaryKeyJoinColumn
Adnotacja 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
SecondaryTable
adnotacji 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
PrimaryKeyJoinColumn
przypadku 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 Id
on OneToOne
i ManyToOne
został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.
Zwykle rozróżniam te dwa za pomocą tego schematu:
Posługiwać się
PrimaryKeyJoinColumn
Posługiwać się
JoinColumn
źródło
PrimaryKeyJoinColumn
użyj tej samej wartości klucza podstawowego, aby połączyć dwie tabele, aJoinColumn
klucz podstawowy tabeli głównej stanie się kluczem obcym w innej tabeli.Wiem, że to stary post, ale dobry moment do wykorzystania
PrimaryKeyColumn
byłby, gdybyś chciał relacji jednokierunkowej lub miał wiele tabel o tym samym identyfikatorze.Ogólnie jest to zły pomysł i lepiej byłoby użyć relacji z kluczem obcym z
JoinColumn
.Powiedziawszy to, jeśli pracujesz na starszej bazie danych, która korzystała z takiego systemu, to byłby dobry moment na jej użycie.
źródło