JPA (Java Persistence API) to standardowa specyfikacja służąca do mapowania obiektowo-relacyjnego (ORM) w aplikacjach Javy. Umożliwia programistom przenoszenie danych między relacyjną bazą danych a obiektami aplikacji bez konieczności pisania zapytań SQL.

Dzięki JPA aplikacja może komunikować się z bazą danych poprzez encje – klasy reprezentujące tabele w bazie. Programista może pracować z danymi w sposób obiektowy, a szczegóły techniczne, takie jak SQL, są zarządzane automatycznie przez framework.

JPA jest specyfikacją – najczęściej wykorzystywaną implementacją JPA jest Hibernate, ale dostępne są też inne, jak EclipseLink czy OpenJPA.

 

Encje i relacje

Encje to obiekty, które mapujemy na rekordy w bazie danych. W JPA mamy różne strategie mapowania pól encji na kolumny w tabeli. Relacje między encjami pozwalają nam definiować jak poszczególne encje ze sobą współpracują. Wyróżniamy relacje wiele do jednego, wiele do wielu i jeden do jednego. Dobre zarządzanie relacjami między encjami ma kluczowe znaczenie w projektach, gdzie pracujemy z dużą ilością danych. W JPA mamy kilka sposobów definiowania relacji między encjami.

 

Czy szukasz wykonawcy projektów IT ?
logo

Typy relacji

W JPA mamy cztery główne typy relacji:

  • @ManyToOne (wiele-do-jednego) – wiele encji może być powiązanych z jedną encją po drugiej stronie relacji.
  • @OneToMany (jeden-do-wielu) – jedna encja może być powiązana z wieloma encjami.
  • @OneToOne (jeden-do-jednego) – jedna encja jest powiązana z dokładnie jedną inną encją.
  • @ManyToMany (wiele-do-wielu) – wiele encji może być powiązanych z wieloma innymi encjami.

 

Uwaga: W relacjach dwukierunkowych należy ustalić stronę właścicielską relacji (mappedBy), co wpływa na sposób zarządzania danymi i zapisów do bazy.

BoringOwl_programming_developer_in_front_of_computer_in_simple__5b5f1e11-9a6b-4d82-ba3e-ebf8e0140cec (1).png

Tworzenie relacji między encjami

Tworzenie relacji między encjami jest jednym z najważniejszych aspektów JPA. Aby umożliwić skuteczne zarządzanie danymi, encje muszą być w stanie odwoływać się do siebie nawzajem. W tym celu wykorzystuje się adnotacje, takie jak @OneToOne, @OneToMany, @ManyToOne i @ManyToMany. Kiedy dodajemy relacje między encjami, możemy wykorzystać język zapytań JPQL do wykonywania zaawansowanych operacji na danych, takich jak pobieranie wyników z kilku tabel jednocześnie. Dzięki temu JPA umożliwia elastyczne zarządzanie danymi w bazie.

 

Operacje CRUD na relacjach

W kontekście relacji między encjami, operacje CRUD (Create, Read, Update, Delete) wymagają dodatkowej ostrożności:

  • W relacjach wiele-do-wielu konieczne jest zarządzanie tabelą łączącą (ang. join table)
  • W relacjach dwukierunkowych, obie strony relacji muszą być odpowiednio zsynchronizowane
  • Operacje mogą być kaskadowane za pomocą CascadeType, np. CascadeType.ALL

 

Serializacja do JSON

Podczas używania JSON (np. z Spring Boot + Jackson) w kontekście relacji dwukierunkowych może dojść do błędu cyklicznej serializacji. Aby temu zapobiec, stosuje się:

  • @JsonManagedReference i @JsonBackReference
  • @JsonIgnore dla jednej ze stron
  • Mapowanie danych do specjalnych klas DTO

Nasza oferta

Powiązane artykuły

Zobacz wszystkie artykuły powiązane z #Back-end