Na warsztat trafia pierwsza encja. Stworzymy klasę z prostymi danymi naszych pierwszych gości. Po dodaniu tylko trzech adnotacji zobaczysz jak JPA automatycznie zaczyna tworzyć tabele z wskazanymi polami i sekwencję do nadawania unikalnych id.
Dla przypomnienia encja jest to taka klasa, której obiekty będą zapisywane poprzez Entity Manager do bazy danych.
W naszej paczce pl.clockworkjava.hotelreservation.jpa stwórz kolejną klasę w Javie i nazwij ją Guest (zgodnie z regułą, że nazywamy je po angielsku).
W naszym hotelu na razie będziemy oryginalni i od gościa poprosimy jedynie imię i wiek.
Proszę stwórz więc pola prywatne dla zmiennej typu String, gdzie zanotujemy jego imię oraz zmienną int, w której przechowamy jego wiek. Dorzuć od razu konstruktor, który przyjmuje oba te argumenty.
Kod powinien wyglądać zatem tak:
package pl.clockworkjava.hotelreservation.jpa; public class Guest { private String name; private int age; public Guest(String name, int age) { this.name = name; this.age = age; } }
Tworzymy pierwszą encję
Pierwszą czynnością aby nasza klasa była oznaczona jako encja jest dodanie adnotacji @Entity. Powinna się pokazać możliwość importowania z dwóch miejsc – javax.persistence i org.hibernate.annotations. Jak długo korzystamy ze standardu JPA używamy javax.persistence (a druga opcja powinna pojawić się przekreślona dla ułatwienia wyboru).
Dobrą praktyką jest korzystanie ze standardu JPA a nie konkretnych implementacji – oczywiście tam gdzie jest to możliwe.
W drugiej kolejności potrzebujemy nadać unikalny identyfikator ID, który musi mieć każda encja.
Na przykładzie naszych hotelowych gości takim ID mógłby być PESEL, który w kontekście Polski stanowi unikalny identyfikator. Tylko co jeśli nasz gość nie pochodzi z naszego kraju?
Lepiej na potrzeby ID, czyli klucza głównego tabeli, w której trzymamy dane, stworzyć osobne pole z generowanym numerem. Nawet jeśli wydaje nam się, że mamy jakiś „naturalny”, unikalny identyfikator.
Zatem tworzymy nasz id (który jest przeważnie zmienna typu long) i dodajemy do niego od razu adnotację @ID (także z javax.presistence).
Dodatkowo dodajmy także adnotację powiązaną czyli @GeneratedValue (oczywiście z javax.presistence), które mówi nam, że dane pole ma być generowane w jakiś sposób. Najczęściej chcemy, żeby to baza zadecydowała o tym jaki sposób generacji wartości dla klucza jest najwygodniejszy . Dajemy więc pole strategy i wybieramy GenerationType.AUTO
package pl.clockworkjava.hotelreservation.jpa; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Guest { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String name; private int age; public Guest(String name, int age) { this.name = name; this.age = age; } }
Co się dzieje w aplikacji
Czas sprawdzić co zrobiliśmy. Odpal aplikację i zobacz log w dolnym oknie. Są pewne zmiany w porównaniu z poprzednim.
Super. Już widać, że nasze ustawienia coś dają. Najpierw widać, że baza danych jest zawsze usuwana a następnie tworzona nowa – bo tak sobie zażyczyliśmy.
Dodatkowo widzimy od czego zacznie się liczenie id – jak widać powyżej od 1 i będzie zwiększane o 1. To w jaki sposób będą naliczane może zależeć od baz danych.
Podsumowanie
Na ten moment zatem mamy skonfigurowane połączenie z bazą danych (H2). Do tego stworzyliśmy wspólnie pierwszą encję, czyli klasę której obiekty będą mogły być zapisywane poprzez Hibernate. Przy wpisaniu zaledwie trzech adnotacji JPA automatycznie zaczyna tworzyć tabele i sekwencję do nadawania unikalnych id.
Kod aplikacji znajdziesz w publicznym repozytorium GitHub.
By być na bieżąco i mieć realny wpływ na tematykę tworzonych przeze mnie artykułów zapraszam do dołączenia do mojego newslettera.
Informacje oparte zostały o materiał darmowego kursu wprowadzającego w świat JPA i Hibernate „Fundamenty JPA i Hibernate” dostępnego w formie wideo na platformie ClockworkJava.