Hibernate One to One Mapping Annotation Example

Jeśli pracujemy nad jakąkolwiek aplikacją hibernacji lub planujemy pracować nad jakąkolwiek w przyszłości, wtedy można łatwo zrozumieć relacje jeden do jednego pomiędzy kilkoma encjami w aplikacji. W tym hibernowanym przykładzie mapowania jeden do jednego, Omówimy 4 różne warianty.

Table of ContentsVarious supported techniques for one to one mapping1. Using foreign key association2. Using join table3. Using shared primary key4. @MapsId

Dla tego hibernowanego przykładu mapowania jeden do jednego, rozszerzam przykład napisany dla hibernowanego przykładu hello world. Mamy tutaj dwie encje: Employee i Account.

Jeden Pracownik może mieć tylko jedno Konto. Podobnie, konto będzie powiązane tylko z jednym pracownikiem. Jest to relacja jeden do jednego dla tego przykładu.

Różne obsługiwane techniki

W hibernacji istnieją 3 sposoby tworzenia relacji jeden do jednego pomiędzy dwoma encjami. W każdym z tych sposobów musimy użyć adnotacji @OneToOne.

  1. Pierwsza technika jest najczęściej używana i wykorzystuje kolumnę klucza obcego w jednej z tabel.
  2. Druga technika używa raczej znanego rozwiązania posiadania trzeciej tabeli do przechowywania mapowania pomiędzy dwoma pierwszymi tabelami.
  3. Trzecia technika jest czymś nowym, co używa wspólnej wartości klucza podstawowego w obu tabelach.

Hibernate one to one mapping with foreign key association

W tego rodzaju asocjacji, kolumna klucza obcego jest tworzona w encji właściciela. Na przykład, jeśli uczynimy EmployeeEntity właścicielem, to dodatkowa kolumna "ACCOUNT_ID" zostanie utworzona w tabeli Employee. Ta kolumna będzie przechowywać klucz obcy dla tabeli Account.

Struktura tabeli będzie wyglądać następująco:

Aby wykonać takie skojarzenie, odwołaj się do encji Account w klasie EmployeeEntity w następujący sposób:

@OneToOne@JoinColumn(name="ACCOUNT_ID")private AccountEntity account;

Kolumna join jest zadeklarowana z adnotacją @JoinColumn, która wygląda jak adnotacja @Column. Posiada ona jeszcze jeden parametr o nazwie referencedColumnName. Ten parametr deklaruje kolumnę w docelowej encji, która będzie używana do złączenia.

Jeśli po stronie właściciela nie zadeklarowano @JoinColumn, stosuje się wartości domyślne. Kolumna(y) złączenia zostanie utworzona w tabeli właściciela, a jej nazwa będzie konkatenacją nazwy relacji po stronie właściciela, _ (podkreślnik) i nazwy kolumny(y) klucza podstawowego po stronie właściciela.

W relacji dwukierunkowej jedna ze stron (i tylko jedna) musi być właścicielem. Właściciel jest odpowiedzialny za aktualizację kolumny (kolumn) asocjacji. Aby zadeklarować stronę jako nie odpowiedzialną za relację, używany jest atrybut mappedBy. Atrybut „mappedBy” odnosi się do nazwy właściwości asocjacji po stronie właściciela.

@OneToOne(mappedBy="account")private EmployeeEntity employee;

Atrybut „above "mappedBy” deklaruje, że jest zależny od właściciela encji dla mapowania.

Testujemy powyższe mapowania w uruchomionym kodzie:

Uruchomienie powyższego kodu tworzy pożądany schemat w bazie danych i uruchamia te zapytania SQL.

Możesz zweryfikować dane i mapowania w obu tabelach po uruchomieniu powyższego programu.

Hibernate one to one mapping with common join table

To podejście nie jest nowe dla nas wszystkich. Zacznijmy od docelowej struktury DB w tej technice.

W tej technice, główna adnotacja, która ma być użyta to @JoinTable. Ta adnotacja jest używana do zdefiniowania nazwy nowej tabeli (obowiązkowo) i kluczy obcych z obu tabel. Zobaczmy jak jest ona używana:

Anotacja @JoinTable jest używana w klasie EmployeeEntity. Deklaruje ona, że nowa tabela EMPLOYEE_ACCOUNT zostanie utworzona z dwiema kolumnami EMPLOYEE_ID (klucz główny tabeli EMPLOYEE) i ACCOUNT_ID (klucz główny tabeli ACCOUNT).

Testowanie powyższych encji generuje następujące zapytania SQL w plikach dziennika:

Hibernate one to one mapping with shared primary key

W tej technice, hibernate zapewni, że użyje wspólnej wartości klucza głównego w obu tabelach. W ten sposób klucz główny EmployeeEntity może być bezpiecznie przyjęty jako klucz główny AccountEntity również.

Struktura tabeli będzie wyglądać następująco:

W tym podejściu, @PrimaryKeyJoinColumn jest główną adnotacją, która ma być użyta. Zobaczmy, jak go użyć.

@OneToOne(cascade = CascadeType.ALL)@PrimaryKeyJoinColumnprivate AccountEntity account;

W AccountEntity stronie, pozostanie zależny od encji właściciela dla mapowania.

@OneToOne(mappedBy="account", cascade=CascadeType.ALL)private EmployeeEntity employee;

Testowanie powyższych encji generuje następujące zapytania SQL w plikach dziennika:

Hibernate one to one mapping with @MapsId

W tej technice hibernacja zakłada, że zarówno źródło, jak i cel mają te same wartości klucza podstawowego.

W tym podejściu, @MapsId jest główną adnotacją, która ma być użyta. Zobaczmy, jak z niej korzystać.

@Idprivate Integer employeeId;@OneToOne @MapsIdprivate AccountEntity account;

W AccountEntity stronie, pozostanie zależna od encji właściciela dla mapowania.

@Idprivate Integer accountId;

Testowanie powyższych encji generuje następujące zapytania SQL w plikach dziennika:

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.