Wdrożenie do projektu
Zaczynamy od stworzenia zwykłego projektu Java. Środowisko z jakiego korzystam to Netbeans
IDE w wersji 8.1. Możesz wykorzystywać inne IDE, bylebyś stosował analogiczne kroki w swoim
środowisku.
Hibernate tutorial - Andrzej Klusiewicz -
Musimy do projektu dodać niezbędne biblioteki. W tym celu wybieramy właściwości projektu i
przechodzimy do sekcji Libraries. Następnie klikamy Add Library:
Powinno nam się pojawić takie okienko:
Hibernate tutorial - Andrzej Klusiewicz -
W tym przykładzie będę korzystał z konta HR umieszczonego w bazie danych Oracle. Będzie mi w
związku z tym potrzebna biblioteka do łączenia się z tą bazą. Pobierz plik ojdbc6 lub ojdbc7 z
internetu i umieść go w strukturze plików projektu. Ja po prostu dorobiłem podkatalog libs i
umieściłem w nim wspomniany plik jar.
Gdy umieścimy już plik we właściwym miejscu, ponownie wchodzimy do właściwości projektu i
dodajemy nowo wrzuconego liba do zależności. Tym razem klikamy jednak nie "Add Library" a
"Add Jar/Folder" i z systemu plików wybieramy wrzucony plik.
Hibernate tutorial - Andrzej Klusiewicz -
Konto z którego korzystam (HR) jest domyślnie utworzone w bazie jeśli zainstalujesz bazę Oracle
w wersji Express Edition. To dosyć lekka wersja bazy, choć pozbawiona części funkcjonalności. Na
nasze potrzeby całkiem starczy. Pamiętaj by odblokować konto HR i ustawić dla niego hasło. W
internecie nie brakuje instrukcji jak to zrobić. Potrzebujemy teraz pliku konfiguracyjnego który
poda Hibernate'owi informacje niezbedne do podpiecia się do bazy. Tworzymy więc pusty plik o
nazwie hibernate.cfg.xml (tak właśnie musi się nazywać) w domyślnym pakiecie:
Jego zawartość powinna wyglądać mniej więcej tak:
Zmień własności username, password i url jeśli Twoja baza znajduje się na zdalnym serwerze lub
korzystasz z innego użytkownika w bazie. Zwróć szczególną uwagę na zapis "mapping resource"
znajdujący sięw tym pliku:
Hibernate tutorial - Andrzej Klusiewicz -
Jest to ścieżka względna (od położenia pliku hibernate.cfg.xml) prowadząca do pliku mapowania
encji. Mapować encje na tabele możesz z użyciem plików XML lub adnotacji. W tym tutorialu
wykorzystuję głównie pliki XML (uważam taką strukturę za bardziej czytelną). W tym pliku
mapowania znajdują się informacje na temat tego w jaki sposób on ma przekładać obiektową
strukturę klas na relacyjną i płaską strukturę tabel. Ilekroć więc będziesz chciał korzystać z nowej
tabeli musisz taki plik stworzyć i dodać do niego link w tym miejscu. U mnie ta ścieżka jest dosyc
długa, ale wynika to ze struktury obiektu. Każda podsekcja nazwy pakietu to podkatalog:
Przy okazji zwróć uwagę na to co i gdzie się znajduje, może to być dla Ciebie ściąga gdybyś nie
wiedział gdzie jaki plik umieścić.
Stwórz teraz klasę HibernateUtil (możesz nazwać ją jak chcesz, tylko będziesz potem musiał
zmienić nazwę klasy w przykładach). Jest to klasa będąca tzw fabryką sesji, a służąca temu byśmy
mieli zawsze aktywną sesję pomiędzy naszą aplikacją a bazą danych. Jest to kod szablonowy. W
zasadzie możesz go skopiować do swojego projektu bez zmian.
Hibernate tutorial - Andrzej Klusiewicz -
Podstawowe mapowanie tabeli
W pierwszym przykładzie będziemy mapować tabelę EMPLOYEES ze schematu HR. To lista
fikcyjnych pracowników fikcyjnej firmy. Mamy tutaj 3 klucze obce (kolumny
job_id,manager_id,department_id) i zazwyczaj oznaczałoby to że obiekt klasy EMPLOYEE
zawierał będzie jakieś trzy obiekty (np. JOB, MANAGER, DEPARTMENT), ale żeby nie
wprowadzać na razie zbytniej komplikacji, zamapujemy te pola jak zwykłe pola liczbowe. Potem
wraz z rozwojem projektu zmienimy to na właściwą strukturę.
Tworzymy w projekcie klasę Employee której obiekty będą reprezentowały pojedyncze wiersze z
tabeli Employees. Dla każdej kolumny w tabeli stwórz odpowiadające mu typem (nazwą
niekoniecznie) pole w klasie.
Hibernate tutorial - Andrzej Klusiewicz -
Gdy już będziesz miał wszystkie pola stwórz gettery i settery. Hibernate będzie domyślnie szukał
takich metod by dostać się do pól obiektu, a więc musisz je posiadać. Mamy gotowy automat w
Netbeansie który zrobi to za nas. Należy wybrać odpowiednią opcję z menu dostępnego pod PPM:
Wyświetli się okno podobne do poniższego. Naciśnij "Select All" i zatwierdź wybór.
Hibernate tutorial - Andrzej Klusiewicz -
Metody te zostaną utworzone i będą wyglądać mniej więcej tak:
Warto też dodać przeciążoną metodę toString. W dalszej części będziemy na konsoli wyświetlać
pobrane z bazy dane i wtedy ta metoda nam się przyda.
Hibernate tutorial - Andrzej Klusiewicz -
Klasa jest już gotowa, teraz czas na wspomniany wcześniej plik mapowania klasy. Stwórz plik
XML w tym samym miejscu w którym znajduje się odwzorowywana klasa i umieść w nim treść
taką jak poniżej.
Linia 5 określa nazwę pakietu w którym Hibernate domyślnie będzie szukał klas do mapowania. W
tym projekcie dla każdej klasy tworzę osobny plik do mapowania, nic nie stoi jednak na
przeszkodzie by mapować wiele klas w jednym pliku. W takie sytuacji osobne wskazanie pakietu
ułatwi nam życie. Linia 6 określa klasę którą chcemy mapować oraz odpowiadającą jej tabelę. Linie
7-9 określają klucz główny tabeli, oraz sposób jego uzupełniania. W linii 7 podajemy nazwę pola
która będzie odpowiednikiem kolumny z kluczem głównym, typ tego pola, oraz odpowiadającą mu
kolumnę. W linii 8 określone jest w jaki sposób klucz główny ma być uzupełniany danymi. W
takim ustawieniu jak teraz będzie wymagane wypełnianie klucza danymi przed wysłaniem obiektu
do zapisania. Jest tu kilka innych możliwości, jednak zajmiemy się nimi nieco później. Linie 10-19
to mapowania poszczególnych pól klasy na kolumny w tabeli. Nie musisz mapować wszystkich
kolumn.
Hibernate tutorial - Andrzej Klusiewicz -
Tworzenie podstawowego dao i jego wykorzystanie
W projekcie utwórz teraz klasę EmployeeDao (nazwa dowolna). Klasa ta będzie zawierała metody
służące pobieraniu danych z bazy i ewentualnemu ich utrwalaniu, aktualizowaniu czy kasowaniu.
Metoda z linii 20-29 powoduje odczytanie z bazy całej zawartości tabeli employees i zwrócenie jej
w postaci listy obiektów. Linia 23 powoduje odebranie działającej sesji z fabryki sesji, w ramach
której będziemy uruchamiać nasze rządania. Linia 24 zawiera element "from Employee". Jest to
zapytanie napisane w obiektowej implementacji SQL wprowadzanej przez Hibernate tj HQL. W
składni tego języka nie piszemy SELECT [kolumny] jak bysmy to zrobili w zwykłym SQL,
ponieważ domyślnie przyjmowane jest że będziemy czytać całą szerokość wiersza. To oczywiście
utrudnia późniejsze ewentualne prace optymalizacyjne na bazie, jednak tym na razie się nie
przejmuj. From Employee określa nazwę klasy której obiekty chcemy wczytać. Zwróć uwagę że
podajemy tutaj nazwę klasy której encje chcemy odczytać, a nie nazwę tabeli!!. Nie ma tutaj
żadnych warunków filtracji – ewentualne określilibyśmy z użyciem klauzuli WHERE. W liniach
31-36 jest przykładowa metoda służąca zapisowi nowego obiektu do bazy. Będzie nam potrzebna
nieco później. Na ten moment nie musisz jej tworzyć.
Hibernate tutorial - Andrzej Klusiewicz -
Uruchomienie projektu
Mamy już wszystkie elementy niezbędne do uruchomienia naszego projektu. Aby przetestować
działanie naszego systemu dorobimy sobie osobną klasę uruchamiającą cały ten bałagan. Jej
jedynym zadaniem jak widać poniżej jest przeiterowanie po liście obiektów klasy Employee
zwracanej z metody naszego DAO i wyświetlenie ich zawartości na konsoli.
Po uruchomieniu powinniśmy zobaczyć na konsoli taki efekt:
Hibernate tutorial - Andrzej Klusiewicz -