Agenda Hibernate Adrian Gawor, Adam Klekotka, Piotr Kubisz Technologie Biznesu Elektronicznego 12 maja 2009 Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 1 / 42
Agenda 1 2 3 4 5 6 7 Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 2 / 42
Agenda Idea powstania Składniki projektu Własności projektu Problem: Oprogramowanie wymaga składowania danych Dostęp do danych musi być szybki i łatwy Większość istniejących baz jest relacyjna zaś oprogramowanie jest zorientowane obiektowo Rozwiązanie: Warstwa pośrednia odwzorowująca dane obiektowe występujące w oprogramowaniu na dane relacyjne Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 3 / 42
[1] Agenda Idea powstania Składniki projektu Własności projektu Data powstania: 2001 rok Autor i lider: Gavin King Najnowsza wersja: 3.3.1 Licencja: Open Source Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 4 / 42
Składniki projektu [1] Agenda Idea powstania Składniki projektu Własności projektu Hibernate Annotations Hibernate EntityManager Hibernate Shards Hibernate Validator Hibernate Search Hibernate Tools NHibernate Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 5 / 42
Własności projektu [1] Agenda Idea powstania Składniki projektu Własności projektu Naturalny sposób programowania Wiele strategii mapowania i zależności pomiędzy obiektami Wysoka skalowalność Wsparcie konwersacji Wiele sposobów dostępu do danych Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 6 / 42
Agenda Własności projektu (2) [1] Idea powstania Składniki projektu Własności projektu Sprawdzenie poprawności wprowadzonych danych Wydajne wyszukiwanie obiektów EJB3.0 Zarówno dla Javy jak i.net Duża integracja ze środowiskami programistycznymi Rozprowadzany na Open Source Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 7 / 42
Agenda Hibernate w prostej aplikacji [3] Hibernate w prostej aplikacji Hibernate w zaawansowanej aplikacji Stany obiektów Rysunek przedstawia podstawowy sposób zastosowania Hibernate a. Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 8 / 42
Agenda Hibernate w zaawansowanej aplikacji [3] Hibernate w prostej aplikacji Hibernate w zaawansowanej aplikacji Stany obiektów Rysunek przedstawia zaawansowany sposób zastosowania Hibernate a. Oprogramowanie budowane jest w 4 warstwach. Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 9 / 42
Stany obiektów [3] Agenda Hibernate w prostej aplikacji Hibernate w zaawansowanej aplikacji Stany obiektów transient - instancja nie jest jeszcze utrwalona w żadnym kontekscie (nie posiada identyfikatora primary key) persistent - instancja została przyporządkowana do kontekstu utrwalającego. Posiada identyfikator (primary key), prawdopodbnie odpowiada wierszowi w bazie. Hibernate gwarantuje, że jeżeli w bazie znajduje się ten obiekt to posiada on wartości takie same jak w środowisku. detached - instancja została już utrwalona, kontekst został zamknięty. Posiada identyfikator i prawdopodbnie odpowiada wierszowi w tabeli. Hibernate nie gwarantuje, że dane w obiekcie Javowym są identyczne z tymi w bazie danych. Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 10 / 42
[3] Agenda ORM Transakcje i mechanizmy blokowania Zwalnia programistę z 95% zadań związanych z utrwalaniem obiektów w relacyjnej bazie danych - mapowania zawarte w dokumentach XML Generuje kod SQL zwalniając z ręcznego operowania obiektami JDBC Umożliwia przenoszenie aplikacji pomiędzy wszystkimi bazami SQL Możliwość zaadoptowania w każdej fazie życia oprogramowania Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 11 / 42
ORM [3] Agenda ORM Transakcje i mechanizmy blokowania Przykładowa implementacja klasy w Javie public class Event { private Long id; private String title; private Date date; public Event() {} // implementacja setterów i getterów } Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 12 / 42
ORM [3] Agenda ORM Transakcje i mechanizmy blokowania Przykładowy deskryptor mapowania XML <?xml v e r s i o n ="1.0"?> <!DOCTYPE h i b e r n a t e mapping PUBLIC " // H i b e r n a t e / H i b e r n a t e Mapping DTD 3. 0 / /EN" " h t t p : / / h i b e r n a t e. s o u r c e f o r g e. n e t / h i b e r n a t e mapping 3.0. dtd"> <h i b e r n a t e mapping> < c l a s s name="e v e n t s. Event " t a b l e ="EVENTS"> <i d name=" i d " column="eventid"> <g e n e r a t o r c l a s s =" n a t i v e "/> </id > <p r o p e r t y name="d a t e " t y p e="timestamp " column="eventdate"/> <p r o p e r t y name=" t i t l e "/> </ c l a s s > </ h i b e r n a t e mapping> Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 13 / 42
Agenda Transakcje i mechanizmy blokowania [3] Mechanizm blokowania pesymistycznego ORM Transakcje i mechanizmy blokowania Nakładnie blokady na wiersz na cały czas manipulowania obiektem Gwarantuje, że zmiany w bazie będą przeprowadzane bezpiecznie Rozwiązanie wysoce nieskalowalne Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 14 / 42
Agenda Transakcje i mechanizmy blokowania [3] Mechanizm blokowania optymistycznego ORM Transakcje i mechanizmy blokowania Zakłada rzadkie występowanie kolicji w manipulowanych danych Zamiast pilnowania by kolizje nie wystąpiły pozwala je rozwiązywać, gdy się zdarzą Blokady zakładane jedynie na moment aktualizacji Powinnien być użyty dla wszystkich encji, które będą używane współbieżnie Brak użycia mechanizmu optymistycznego blokowania przenosi odpowiedzialność zarządzania spójnością danych na warstwę aplikacji Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 15 / 42
Agenda Transakcje i mechanizmy blokowania [3] Mechanizm blokowania optymistycznego w Hibernate ORM Transakcje i mechanizmy blokowania Dla pobieranego dokumentu tworzona jest wersja Przy aktualizacji Hibernate sprawdza wartość wersji w systemie oraz dostępnej wersji w bazie. Niezgodność wersji skutkuje rzuceniem wyjątku OptimisticLockExeption Możliwość jawnego podania adnotacji @Version dla liczby stałoprzecinkowej bądź znacznika czasu Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 16 / 42
Agenda HQL EJB QL / JPQL QBC SQL Hibernate udostępnia kilka języków dostępu do danych: Hibernate Query Language (HQL) EJB Query Language (EJB QL / JPQL) Query By Criteria (QBC) Native SQL Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 17 / 42
Agenda Hibernate Query Language [3] HQL EJB QL / JPQL QBC SQL Własności Obiektowy Składnia zbliżona do SQL Złączenia, podzapytania i grupowanie Funkcje agregujące Opcjonalność klauzuli select Największe możliwości z języków udostępnianych przez Hibernate Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 18 / 42
Agenda Hibernate Query Language [3] HQL EJB QL / JPQL QBC SQL Przykładowe zapytanie HQL select cat.weight + sum(kitten.weight) from Cat cat join cat.kittens kitten group by cat.id, cat.weight Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 19 / 42
Agenda HQL EJB QL / JPQL QBC SQL Enterprise JavaBeans Query Language [4] Własności Składnik standardu EJB W EJB 3.0 nazwa została zmieniona na JPQL (Java Persistence Query Language) inspirowany językiem HQL (posiada to samo API) Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 20 / 42
Agenda EJB Query Language [4] HQL EJB QL / JPQL QBC SQL Przykładowe zapytanie select cust from Product prod, Store store inner join store.customers cust where prod.name = widget and store.location.name in ( Melbourne, Sydney ) and prod = all elements(cust.currentorder.lineitems) Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 21 / 42
Query By Criteria [3] Agenda HQL EJB QL / JPQL QBC SQL Własności mniej popularny niż HQL mocno ograniczone możliwości zapytanie dotyczy tylko jednej klasy trwałej umożliwia sortowanie pozwala na natywne kryteria SQL Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 22 / 42
Query By Criteria [3] Agenda HQL EJB QL / JPQL QBC SQL QBC polega na zawężaniu kolekcji obiektów poprzez określanie kryteriów wyboru. Przykładowe kryteria Restrictions.isNull Restrictions.eq Restrictions.like Restrictions.between Restrictions.sqlRestriction Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 23 / 42
Query By Criteria [3] Agenda HQL EJB QL / JPQL QBC SQL Przykładowe zapytanie L i s t c a t s = s e s s. c r e a t e C r i t e r i a ( Cat. c l a s s ). add ( R e s t r i c t i o n s. l i k e (" name ", "F%"). addorder ( Order. asc (" name ") ). addorder ( Order. desc (" age ") ). l i s t ( ) ; Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 24 / 42
Native SQL [3] Agenda HQL EJB QL / JPQL QBC SQL Własności Pozwala wykorzystać mechanizmy specyficzne dla danego systemu zarządzania bazą danych Ułatwia przenoszenie aplikacji z JDBC do Hibernate Uzależnia implementację od konkretnego SZBD Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 25 / 42
Native SQL Agenda HQL EJB QL / JPQL QBC SQL Przykładowe zapytanie s e s s i o n. createsqlquery ( "SELECT ID, NAME, BIRTHDATE FROM CATS " ). l i s t ( ) ; s e s s. createsqlquery ( "SELECT ID, NAME, BIRTHDATE FROM CATS " ). a d d E n t i t y ( Cat. c l a s s ) ; Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 26 / 42
Agenda Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Framework pozwalający na ustandaryzowany sposób zarządzania danymi w aplikacjach Java SE i EE. Własności JPA Oficjalny standard ORM Składnik standardu Enterprise JavaBeans 3.0 W jego tworzenie zaangażowany był m.in. twórca Hibernate - Gavin King Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 27 / 42
Agenda Implementacja JPA w Hibernate Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Hibernate implementuje JPA w postaci warstwy opakowującej Implementacja podzielona jest na dwa niezależne pakiety: Hibernate Annotations Hibernate EntityManager Pakiety są od siebie niezależne Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 28 / 42
Agenda Hibernate Annotations [2] Własności Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Implementuje wszystkie adnotacje EJB 3.0 / JPA, włącznie z opcjonalnymi adnotacjami można zastąpić większość składowych mapowania XML Configuration by exception Adnotowanie atrybutów lub ich akcesorów Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 29 / 42
Agenda Hibernate Annotations [2] Możliwości Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Mapowanie prostych i złożonych atrybutów Definiowanie związków między encjami Określanie strategii dziedziczenia Mapowanie identyfikatorów encji Tuning wydajności Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 30 / 42
Agenda Hibernate Annotations [2] Przykładowe adnotacje Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager @Entity @Id @Basic @Transient @Temporal @Lob Związki: @ManyToMany, @OneToMany, @OneToOne @Embedded Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 31 / 42
Agenda Hibernate EntityManager [4] Własności Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Implementuje interfejsy programistyczne oferowane przez JPA Opakowuje metody z pakietu HibernateCore Razem z HibernateAnnotations tworzy kompletną implementację standardu JPA Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 32 / 42
Agenda Hibernate EntityManager [4] Klasa EntityManagerFactory Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager EntityManagerFactory Opakowuje SessionFactory Zawiera dane połączenia z konkretnym źródłem danych Zapewnia tworzenie instancji EntityManager a Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 33 / 42
Agenda Hibernate EntityManager [4] Klasa EntityManager Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager EntityManager Opakowuje Session Zawiera konkretne połączenie ze źródłem danych Umożliwia wykonywanie zapytań EJB-QL Pozwala na utrwalanie obiektów Zarządza transakcjami Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 34 / 42
Cache w Hibernate [3] Agenda Cache Hibernate Validator Hibernate Tools NHibernate Hibernate posiada 2-poziomowy cache: I poziom - Session (zakres transakcji) II poziom - SessionFactory (zakres całej aplikacji) Wybrani dostawcy cache u II poziomu EHCache SwarmCache JBoss Cache Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 35 / 42
Agenda Hibernate Validator [1] Cache Hibernate Validator Hibernate Tools NHibernate Pakiet umożliwiający walidację atrybutów klas trwałych. HibernateValidator działa na dwóch poziomach: sprawdza obiekty znajdujące się w pamieci dodaje ograniczenia do schematu bazy danych Przykładowe ograniczenia @NotNull @Max(value=) @Past Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 36 / 42
Agenda Hibernate Validator [1] Dokonywanie walidacji Cache Hibernate Validator Hibernate Tools NHibernate W warstwie aplikacji JSF + JBoss Seam <s:validate> W warstwie biznesowej C l a s s V a l i d a t o r p e r s o n V a l i d a t o r = new C l a s s V a l i d a t o r ( Person. c l a s s ) ; I n v a l i d V a l u e [ ] v a l i d a t i o n M e s s a g e s = p e r s o n V a l i d a t o r. g e t I n v a l i d V a l u e s ( p e r s o n ) ; Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 37 / 42
Hibernate Tools [1] Agenda Cache Hibernate Validator Hibernate Tools NHibernate Opis Zbiór narzędzi dla Hibernate a i powiązanych z nim projektów, które ułatwiają pracę ze środowiskiem. Mapping Editor - Ułatwia pracę z plikami XML dotyczącymi mapowania obiektów. Console - Pozwala zadawać interaktywnie zapytania w języku HQL. Dostarcza wizualizacje powiązań klas. Reverse Engineering - Najbardziej zaawansowane narzędzie z projektu. Pozwala wygenerować model klas, pliki mapowania, adnotacje, dokumentacje HTML z istniejącej bazy. Wizards - Ułatwiają tworzenie konfiguracji Hibernate a Ant task - Zajmuje się tworzeniem zadań dla Anta. Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 38 / 42
NHibernate [1] Agenda Cache Hibernate Validator Hibernate Tools NHibernate Opis Wersja Hibernate a dla środowiska Microsoft.NET Przeportowany Hibernate 2.1 for Java Wymagany Framework.NET w wersji 1.1 lub 2.0 Rozprowadzany na licencji Open Source Silna integracja z MS Visual Studio Wartość podstawowej części projektu to około 182 osobolata praca, czyli ok 10 mln dolarów Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 39 / 42
Podsumowanie Agenda Podsumowanie Bibliografia Przykłady Hibernate jest bardzo dojrzałym rozwiązaniem ORM Projekt zawiera wiele modułów ułatwiających pracę oraz wspomagających proces tworzenia oprogramowania Implementuje standard JPA Licencja LGPL sprawia, że możemy go użyć w dowolnym projekcie, ZA DARMO Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 40 / 42
Bibliografia Agenda Podsumowanie Bibliografia Przykłady Hibernate - relational persistence for idiomatic java, Maj 2009. http://www.hibernate.org/. Hibernate annotations reference documentation, Maj 2009. http://docs.jboss.org/hibernate/stable/annotations/reference/en/. Hibernate core reference documentation, Maj 2009. http://docs.jboss.org/hibernate/stable/core/reference/en/. Hibernate entitymanager reference documentation, Maj 2009. http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/. Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 41 / 42
Przykłady Agenda Podsumowanie Bibliografia Przykłady Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 42 / 42