W tym kodzie, jak wygenerować klasę Java dla klucza złożonego (jak złożyć klucz w trybie hibernacji):
create table Time (
levelStation int(15) not null,
src varchar(100) not null,
dst varchar(100) not null,
distance int(15) not null,
price int(15) not null,
confPathID int(15) not null,
constraint ConfPath_fk foreign key(confPathID) references ConfPath(confPathID),
primary key (levelStation, confPathID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Odpowiedzi:
Mapować klucza kompozytowego, można użyć
EmbeddedId
albo naIdClass
adnotacje. Wiem, że to pytanie nie dotyczy wyłącznie WZP, ale mają również zastosowanie reguły określone w specyfikacji. Oto one:Z
IdClass
Klasa złożonego klucza głównego może wyglądać (może być statyczną klasą wewnętrzną):
A jednostka:
IdClass
Adnotacja odwzorowuje kilka pól do PK stołowego.Z
EmbeddedId
Klasa złożonego klucza głównego może wyglądać (może być statyczną klasą wewnętrzną):
A jednostka:
@EmbeddedId
Adnotacja odwzorowuje klasę PK PK do stołu.Różnice:
@EmbeddedId
w jakiś sposób komunikuje się jaśniej, że klucz jest kluczem złożonym, a IMO ma sens, gdy połączony pk jest samą znaczącą jednostką lub jest ponownie używany w kodzie .@IdClass
przydatne jest określenie, że niektóre kombinacje pól są unikalne, ale nie mają one specjalnego znaczenia .Wpływają również na sposób pisania zapytań (co powoduje, że są mniej lub bardziej szczegółowe):
z
IdClass
z
EmbeddedId
Bibliografia
źródło
id
jest zawszenull
i nie jest generowane: /@IdClass
: „Został odziedziczony po ciemnych czasach EJB 2 dla wstecznej kompatybilności i zalecamy, aby go nie używać (dla uproszczenia)”.Musisz użyć
@EmbeddedId
:źródło
Jak wyjaśniłem w tym artykule , zakładając, że masz następujące tabele bazy danych:
Najpierw musisz utworzyć
@Embeddable
holding złożony identyfikator:Dzięki temu możemy zmapować
Employee
byt, który korzysta ze złożonego identyfikatora, dodając do niego adnotacje@EmbeddedId
:Phone
Podmiot, który ma@ManyToOne
skojarzenie zEmployee
, musi odnosić się do kompozytowego identyfikator z grupy macierzystej przez dwóch@JoinColumn
przekształceń:Aby uzyskać więcej informacji, sprawdź ten artykuł .
źródło
Klasa klucza podstawowego musi definiować metody equals i hashCode
Mówiąc bardziej technicznie: powinieneś postępować zgodnie z zasadą substytucji Liskowsa i ignorować symetryczność.
http://www.laliluna.de/jpa-hibernate-guide/ch06s06.html
źródło
Wygląda na to, że robisz to od zera. Spróbuj użyć dostępnych narzędzi inżynierii odwrotnej, takich jak Netbeans Entities z bazy danych, aby przynajmniej zautomatyzować podstawy (np. Osadzone identyfikatory). To może stać się ogromnym bólem głowy, jeśli masz wiele stolików. Sugeruję, aby nie wymyślać na nowo koła i używać jak największej liczby dostępnych narzędzi, aby zredukować kodowanie do minimum i najważniejszej części tego, co zamierzasz zrobić.
źródło
Weźmy prosty przykład. Powiedzmy dwie tabele o nazwie
test
icustomer
są tam opisane jako:Jest jeszcze jeden stół, który śledzi
test
s icustomer
:Widzimy, że w tabeli
tests_purchased
klucz podstawowy jest kluczem złożonym, więc użyjemy<composite-id ...>...</composite-id>
znacznika whbm.xml
pliku odwzorowania.PurchasedTest.hbm.xml
Będzie więc wyglądać następująco:Ale to nie koniec. W Hibernacji używamy session.load (
entityClass
,id_type_object
), aby znaleźć i załadować byt za pomocą klucza podstawowego. W przypadku kluczy złożonych, obiekt ID powinien być osobną klasą ID (w powyższym przypadkuPurchasedTestId
klasą), która po prostu deklaruje podstawowe atrybuty klucza, jak poniżej :Ważną kwestią jest to, że implementujemy również dwie funkcje
hashCode()
iequals()
ponieważ Hibernacja na nich polega.źródło
Inną opcją jest mapowanie jako Mapa elementów kompozytowych w tabeli ConfPath.
To mapowanie skorzystałoby z indeksu na (ConfPathID, levelStation).
Mapowanie:
źródło
Klasa klucza kompozytowego
Klasa podmiotu
źródło