Hibernate
Transkrypt
Hibernate
Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Hibernate Adrian Gawor, Adam Klekotka, Piotr Kubisz Technologie Biznesu Elektronicznego 12 maja 2009 Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 1 / 42 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie 1 Informacje ogólne 2 Architektura projektu 3 Hibernate Core 4 Języki zapytań 5 Java Persistence API 6 Inne składniki pakietu 7 Zakończenie Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 2 / 42 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Idea powstania Składniki projektu Własności projektu Informacje ogólne 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Idea powstania Składniki projektu Własności projektu Informacje ogólne [1] • 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Idea powstania Składniki projektu Własności projektu Składniki projektu [1] • Hibernate Core • Hibernate Annotations • Hibernate EntityManager • Hibernate Shards • Hibernate Validator • Hibernate Search • Hibernate Tools • NHibernate Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 5 / 42 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Idea powstania Składniki projektu Własności projektu Własności projektu [1] • 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Idea powstania Składniki projektu Własności projektu Własności projektu (2) [1] • 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Hibernate w prostej aplikacji Hibernate w zaawansowanej aplikacji Stany obiektów Hibernate w prostej aplikacji [3] Rysunek przedstawia podstawowy sposób zastosowania Hibernate’a. Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 8 / 42 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Hibernate w prostej aplikacji Hibernate w zaawansowanej aplikacji Stany obiektów Hibernate w zaawansowanej aplikacji [3] Rysunek przedstawia zaawansowany sposób zastosowania Hibernate’a. Oprogramowanie budowane jest w 4 warstwach. Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 9 / 42 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Hibernate w prostej aplikacji Hibernate w zaawansowanej aplikacji Stany obiektów Stany obiektów [3] • 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie ORM Transakcje i mechanizmy blokowania Hibernate Core [3] • 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie ORM Transakcje i mechanizmy blokowania ORM [3] 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie ORM Transakcje i mechanizmy blokowania ORM [3] 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 . d t d"> <h i b e r n a t e −mapping> < c l a s s name=" e v e n t s . E v e n t " 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 "/> </i d > <p r o p e r t y name=" d a t e " t y p e ="t i m e s t a m p " 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie ORM Transakcje i mechanizmy blokowania Transakcje i mechanizmy blokowania [3] Mechanizm blokowania pesymistycznego • 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie ORM Transakcje i mechanizmy blokowania Transakcje i mechanizmy blokowania [3] Mechanizm blokowania optymistycznego • 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie ORM Transakcje i mechanizmy blokowania Transakcje i mechanizmy blokowania [3] Mechanizm blokowania optymistycznego w Hibernate • 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie HQL EJB QL / JPQL QBC SQL Języki zapytań 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie HQL EJB QL / JPQL QBC SQL Hibernate Query Language [3] 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie HQL EJB QL / JPQL QBC SQL Hibernate Query Language [3] 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie HQL EJB QL / JPQL QBC SQL EJB Query Language [4] 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie HQL EJB QL / JPQL QBC SQL Query By Criteria [3] 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie HQL EJB QL / JPQL QBC SQL Query By Criteria [3] 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie HQL EJB QL / JPQL QBC SQL Query By Criteria [3] 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%") . a d d O r d e r ( O r d e r . a s c ( " name " ) ) . a d d O r d e r ( O r d e r . d e s c ( " age " ) ) . list (); Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 24 / 42 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie HQL EJB QL / JPQL QBC SQL Native SQL [3] 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie HQL EJB QL / JPQL QBC SQL Native 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Java Persistence API 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Implementacja JPA w Hibernate • Hibernate implementuje JPA w postaci warstwy opakowującej Hibernate Core • 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Hibernate Annotations [2] Własności • 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Hibernate Annotations [2] Możliwości • 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Hibernate Annotations [2] Przykładowe adnotacje • @Entity • @Id • @Basic • @Transient • @Temporal • @Lob • Związki: @ManyToMany , @OneToMany , @OneToOne • @Embedded Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 31 / 42 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Hibernate EntityManager [4] Własności • 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Hibernate EntityManager [4] Klasa EntityManagerFactory 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Implementacja JPA w Hibernate Hibernate Annotations Hibernate EntityManager Hibernate EntityManager [4] Klasa 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Cache Hibernate Validator Hibernate Tools NHibernate Cache w Hibernate [3] 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Cache Hibernate Validator Hibernate Tools NHibernate Hibernate Validator [1] 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 Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Cache Hibernate Validator Hibernate Tools NHibernate Hibernate Validator [1] Dokonywanie walidacji W warstwie aplikacji JSF + JBoss Seam <s:validate> W warstwie biznesowej ClassValidator personValidator = new C l a s s V a l i d a t o r ( P e r s o n . c l a s s ) ; InvalidValue [ ] validationMessages = personValidator . g e t I n v a l i d V a l u e s ( person ) ; Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 37 / 42 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Cache Hibernate Validator Hibernate Tools NHibernate Hibernate Tools [1] 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Cache Hibernate Validator Hibernate Tools NHibernate NHibernate [1] 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Podsumowanie Bibliografia Przykłady Podsumowanie • 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Podsumowanie Bibliografia Przykłady Bibliografia 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 Agenda Informacje ogólne Architektura projektu Hibernate Core Języki zapytań Java Persistence API Inne składniki pakietu Zakończenie Podsumowanie Bibliografia Przykłady Przykłady Adrian Gawor, Adam Klekotka, Piotr Kubisz Hibernate 42 / 42