Konfiguracja HIBERnate, postgresQL + przykładowa aplikacja Instalacja Konfiguracja HIBERnate, postgresQL + przykładowa aplikacja
Tutorial ten będzie przeprowadzony w środowisku Windows Użyte IDE - IntelliJ
Wymagania wstępne Zainstalowany JDK
PostgreSQL Pobieramy PostgresSQL dla Windows http://www.enterprisedb.com/products-services-training/pgdownload Link zawiera również PgAdmin – graficzny interfejs dla PostgreSQL
Instalujemy ściągnięte oprogramowanie
Wybieramy lokalizację
Wybieramy lokalizację, gdzie będziemy składować dane
Tworzymy hasło dla superuser’a – postgres (będzie potrzebne przy konfiguracji Hibernate’a). W naszym przypadku hasło zostanie ustalone na „postgres”
Wybieramy numer portu na którym będzie nasłuchiwał serwer Wybieramy numer portu na którym będzie nasłuchiwał serwer. W naszym przypadku 5432 (również będzie to potrzebne przy konfiguracji Hibernate)
Wybieramy domyślną lokalizację
Klikamy dwa razy Next i instalujemy PostgreSQL
Po zakończeniu instalacji, możemy przejść do PgAdminIII, który został również zainstalowany – graficzny interfejs
Klikamy dwukrotnie na (localhost:5432) Klikamy dwukrotnie na (localhost:5432). Podajemy hasło, które wprowadziliśmy podczas instalacji. W naszym przypadku: postgres
Tworzymy nową bazę danych
Nadajemy jej nazwę i OK
Mamy założoną bazę danych. Jest na razie pusta.
Aplikacja w Javie Kolejnym krokiem będzie stworzenie aplikacji w Javie, używającej Hibernate. Należy poprawnie skonfigurować Hibernate – jak na kolejnych slajdach Projekt zostanie utworzony w IntelliJ IDE
Tworzmy nowy projekt – Java Module
Mamy utworzony pusty projekt
Jak widać stworzyliśmy dwa moduły: Stwórzmy strukturę plików jak niżej. Na razie wszystkie pliki są puste. Zawartość uzupełnimy później Jak widać stworzyliśmy dwa moduły: Application – w którym będzie logika naszej aplikacji Persistance – w której zamodelujemy klasy, które będą persystowane (Message, Thread) Do budowy oraz do pobrania niezbędnych bibliotek będziemy używać Maven’a, stąd też stworzone pliki pom.xml (po jednym dla każdego z modułów oraz jeden nadrzędny). Na kolejnych slajdach zaprezentujemy ich zawartość
Moduł application – pom.xml Dependency: Postgresql – driver JDBC Dom4j – hibernate-core go używa Pl.agh.hibernate.tutorial: persistance – moduł persystencji zawierający modelowane klasy
Moduł persistance – pom.xml Dependency: Hibernate-core – główna biblioteka hibernate, odpowiadająca za mapowanie O/R Hibernate-annotations – pozwala na mapowanie poprzez tagowanie Hibernate-validator – dodaje możliwość dodawania tagów constraintowych do pól persystowanej klasy Hibernate-entitymanager - Połączenie podprojektówHibernate EntityManager oraz Hibernate Annotations pozwala posługiwać się techniką mapowania obiektowo-relacyjnego zgodnie ze standardem JPA Hibernate-jpa
Moduł nadrzędny – pom.xml Zaznaczamy obecność ‚pomów’ podrzędnych
Wystarczy teraz przy użyciu Mavena pobrać wszystkie zadeklarowane dependency, aby mieć dostęp do potrzebnego API
Klasy modelowe Message Thread
Message W naszym rozwiązaniu będziemy korzystać z możliwości mapowania klas tagami, zamiast tworzenia plików hbm.xml (o nich później) Każda klasa POJO jest tzw. entity i jest deklarowana przy użyciu @Entity (na poziomie klasy) @Table pozwala zmapować naszą klasę na tabelę w bazie danych. Możemy ustawić 4 atrybuty: nazwę tabeli, jej katalog, schemat oraz możemy ustawić UNIQUE constarints dla poszczególnych kolumn
Message @Table pozwala zmapować naszą klasę na tabelę w bazie danych. Możemy ustawić 4 atrybuty: Name - nazwę tabeli Catalogue - jej katalog, Schema - schemat UniqueConstraint - umożliwia ustawienie UNIQUE constarints dla poszczególnych kolumn W naszym przypadku, ustawiamy tylko nazwę tabeli
Message @Id deklaruje identyfikator entity, primary key Istnieje możliwość wskazania pól, które mają zostać wygenerowane automatycznie. Może się to przydać na przykład w przypadku primary key. W tym celu używamy @GeneratedValue(strategy=…) JPA definiuje 5 typów strategii generowania: AUTO TABLE IDENTITY SEQUENCE Identity copy Hibernate proponuje więcej niż JPA (patrz dok.)
Message @Column – określa kolumnę, która będzie zmapowana z pola nad którym znajduje się adnotacja. Możliwe jest ustawienie atrybutów: Name – nazwa Unique – UNIQUE contsraint, domyślnie false Nullable – czy kolumna może zawierać null Insertable – czy kolumna może być częścią INSERTa Updatable – czy kolumna może być częścią UPDATEa columnDefinition – nadpisuje sql DDL fragment Table – docelowa tabela Length – długość kolumny (domyślnie 255) Precision – precyzja dziesiętna Scale
Mapowanie relacji – pojawia się potrzeba mapowania relacji Mapowanie relacji – pojawia się potrzeba mapowania relacji. Z pomocą przychodzą adnotacje: One-to-one – jeden do jednego. Mamy trzy sytuacje: Dwa entity dzielą primary key (feorign key jest przechowywany przez jeden z nich). Używamy @PrimaryKeyJoinColumn
One-to-one – jeden do jednego. Mamy trzy sytuacje: Dwa entity dzielą primary key (feorign key jest przechowywany przez jeden z nich). Używamy @PrimaryKeyJoinColumn Połączenie dwóch entity jawną kolumną foreign key Asocjacje mogą być dwustronne. Wtedy jedna ze stron musi być właścicielem. Właściciel jest odpowiedzialny za update kolumny. Aby oznaczyć kolumnę jako nie właściciel używamy mappedBy. Nie jest to w tym przykładzie potrzebne, bo już ustawiliśmy po stronie właściciela @JoinColumn
One-to-one – jeden do jednego. Mamy trzy sytuacje: Dwa entity dzielą primary key (foreign key jest przechowywany przez jeden z nich). Używamy @PrimaryKeyJoinColumn Połączenie dwóch entity jawną kolumną foreign key Z użyciem tabeli łącznikowej Tworzymy tutaj tabelę łącznikową CustomerPassports, która używa primary key customer’a i passport
Many-to-one - wiele do jednego. Domyślna nazwa kolumny – thread_id Istnieje możliwość określenia ręcznie nazwa - @JoinColumn(name=…) Możemy też zrealizować taką relację przy użyciu tabeli łącznikowej