Articles

Hibernate One to Many annotation Tutorial

wprowadzenie

Ten szybki samouczek Hibernate przeprowadzi nas przez przykład mapowania jeden do wielu przy użyciu adnotacji JPA, alternatywy dla XML.

dowiemy się również, czym są relacje dwukierunkowe, jak mogą tworzyć niespójności i jak może pomóc idea własności.

Czytaj dalej:

Spring Boot with Hibernate

szybkie, praktyczne wprowadzenie do integracji Spring Boot i Hibernate/JPA.
Czytaj więcej →

przegląd identyfikatorów w Hibernate/JPA

dowiedz się, jak mapować identyfikatory encji za pomocą Hibernate.
Czytaj więcej →

opis

Mówiąc najprościej, mapowanie jeden do wielu oznacza, że jeden wiersz tabeli jest mapowany do wielu wierszy w innej tabeli.

spójrzmy na poniższy diagram relacji encji, aby zobaczyć skojarzenie jeden do wielu:

w tym przykładzie zaimplementujemy system koszyka, w którym mamy tabelę dla każdego koszyka i kolejną tabelę dla każdego elementu. Jeden koszyk może mieć wiele przedmiotów, więc tutaj mamy mapowanie jeden do wielu.

sposób, w jaki działa to na poziomie bazy danych, polega na tym, że mamy cart_id jako klucz podstawowy w tabeli koszyka, a także cart_id jako klucz obcy w elementach.

robimy to w kodzie z @OneToMany.

zmapujmy klasę Cart do obiektu Items w sposób odzwierciedlający relację w bazie danych:

public class Cart { //... @OneToMany(mappedBy="cart") private Set<Items> items; //...}

możemy również dodać odniesienie do koszyka w Items używając @ManyToOne, co czyni tę relację dwukierunkową. Dwukierunkowy oznacza, że jesteśmy w stanie uzyskać dostęp do przedmiotów z wózków, a także wózków z przedmiotów.

właściwość mappedBy jest tym, czego używamy, aby powiedzieć Hibernate, której zmiennej używamy do reprezentowania klasy nadrzędnej w naszej klasie podrzędnej.

następujące technologie i biblioteki są używane do opracowania przykładowej aplikacji Hibernate, która implementuje skojarzenie jeden do wielu:

  • JDK 1.8 lub nowszy
  • Hibernate 5
  • Maven 3 lub nowszy
  • H2 database

Setup

3.1. Konfiguracja bazy danych

poniżej znajduje się nasz skrypt bazy danych dla tabel koszyka i elementów. Używamy ograniczenia klucza obcego do mapowania jeden do wielu:

nasza konfiguracja bazy danych jest gotowa, więc przejdźmy do stworzenia przykładowego projektu Hibernate.

3.2. Maven Dependencies

następnie dodamy zależności sterownika Hibernate i H2 do naszego pom.plik xml. Zależność Hibernate używa logowania JBoss i automatycznie jest dodawana jako zależności przejściowe:

  • Hibernate wersja 5.2.7.Final
  • H2 driver version 1.4.197

odwiedź centralne repozytorium Maven, aby zapoznać się z najnowszymi wersjami Hibernate i zależnościami H2.

3.3. Konfiguracja Hibernate

oto konfiguracja Hibernate:

3.4. Klasa HibernateAnnotationUtil

W przypadku klasy HibernateAnnotationUtil musimy tylko odwołać się do nowego pliku konfiguracyjnego Hibernate:

modele

konfiguracje związane z mapowaniem będą wykonywane przy użyciu adnotacji JPA w klasach modeli:

@Entity@Table(name="CART")public class Cart { //... @OneToMany(mappedBy="cart") private Set<Items> items; // getters and setters}

należy pamiętać, że adnotacja @OneToMany jest używana do definiowania właściwości w klasie Items, która będzie używana do mapowania zmiennej mappedBy. Dlatego mamy właściwość o nazwie „cart” w klasie Items:

ważne jest również, aby pamiętać, że adnotacja @ManyToOne jest powiązana ze zmienną klasy Cart. Adnotacja @ JoinColumn odwołuje się do zmapowanej kolumny.

w akcji

w programie testowym tworzymy klasę z metodą main() do uzyskania sesji hibernacji i zapisania obiektów modelu do bazy danych implementując skojarzenie jeden do wielu:

To jest wyjście naszego programu testowego:

Adnotacja @ManyToOne

jak widzieliśmy w sekcji 2, możemy określ relację wiele do jednego, używając adnotacji @manytoone. Mapowanie wielu do jednego oznacza, że wiele instancji tej jednostki jest mapowanych do jednej instancji innej jednostki – wiele elementów w jednym koszyku.

adnotacja @ManyToOne pozwala nam również tworzyć dwukierunkowe relacje. Omówimy to szczegółowo w kilku następnych podrozdziałach.

6.1. Niespójności i własność

teraz, jeśli Koszyk odwołuje się do elementów, ale elementy z kolei nie odwołują się do koszyka, nasza relacja byłaby jednokierunkowa. Obiekty mają również naturalną konsystencję.

w naszym przypadku jednak relacja jest dwukierunkowa, co powoduje możliwość niespójności.

wyobraźmy sobie sytuację, w której programista chce dodać item1 do koszyka, a item2 do cart2, ale popełnia błąd, tak że odniesienia między cart2 a item2 stają się niespójne:

jak pokazano powyżej, item2 odwołuje się do cart2, podczas gdy cart2 nie odwołuje się do item2, a to jest złe.

W Jaki Sposób Hibernate powinien zapisać item2 do bazy danych? Czy item2 foreign key reference cart1 czy cart2?

rozwiązujemy tę dwuznaczność za pomocą idei strony posiadającej relację; referencje należące do strony posiadającej mają pierwszeństwo i są zapisywane w bazie danych.

6.2. Elementy jako strona posiadająca

jak stwierdzono w specyfikacji JPA w sekcji 2.9, dobrą praktyką jest oznaczanie wielu do jednej strony jako strony posiadającej.

innymi słowy, przedmioty byłyby stroną własnościową, a Wózki stroną odwrotną, co dokładnie zrobiliśmy wcześniej.

więc jak to osiągnęliśmy?

poprzez włączenie atrybutu mappedBy do klasy Cart, oznaczamy go jako stronę odwrotną.

w tym samym czasie również adnotujemy pozycje.pole koszyka z @ManyToOne, dzięki czemu przedmioty są po stronie właściciela.

wracając do naszego przykładu „niespójności”, teraz Hibernate wie, że odniesienie do item2 jest ważniejsze i zapisze odniesienie item2 do bazy danych.

sprawdźmy wynik:

item1 ID=1, Foreign Key Cart ID=1item2 ID=2, Foreign Key Cart ID=2

chociaż Cart odwołuje się do item2 w naszym fragmencie, odniesienie item2 do cart2 jest zapisywane w bazie danych.

Koszyk jako strona posiadająca

możliwe jest również oznaczyć stronę jeden do wielu jako stronę posiadającą, a wiele do jednego jako stronę odwrotną.

chociaż nie jest to zalecana praktyka, spróbujmy.

poniższy fragment kodu pokazuje implementację strony one-to-many jako strony posiadającej:

zauważ, jak usunęliśmy element mappedBy i ustawiliśmy many-to-one @JoinColumn jako insertable i updatable na false.

Jeśli uruchomimy ten sam kod, wynik będzie odwrotny:

item1 ID=1, Foreign Key Cart ID=1item2 ID=2, Foreign Key Cart ID=1

jak pokazano powyżej, teraz item2 należy do koszyka.

podsumowanie

widzieliśmy, jak łatwo jest zaimplementować relację jeden do wielu z bazą danych Hibernate ORM i H2 za pomocą adnotacji JPA.

dodatkowo dowiedzieliśmy się o związkach dwukierunkowych i o tym, jak wdrożyć pojęcie strony posiadającej.