Podstawowe cechy i API
Hibernate
Rafał Kasprzyk
Rafał Kasprzyk
Hibernate – wprowadzenie
Hibernate jest frameworkiem
służącym do zapewniania trwałości
danych
wsparcie mapowania modelu
obiektowego na model relacyjny
Zadaniem zestawu narzędzi
wchodzących w skład biblioteki jest
połączenie środowiska obiektowego Javy
z systemami relacyjnych baz danych
NIE WYMAGA SERWERA
APLIKACJI !!!
Obecnie jest zarządzany i rozwijany
przez firmę JBoss Inc.
Rafał Kasprzyk
Hibernate - wprowadzenie
Hibernate jest frameworkiem
wyróżniającym się spośród wszystkich
narzędzi ORM
Dostępny jako open source
Popularny, stabilny, wysoko wydajny
Posiada wyjątkowo rozbudowane możliwości
definiowania mapowań oraz bardzo wygodny
model użycia
Obsługuje większość liczących się na rynku
systemów bazodanowych
Oracle, DB2, MySQL, PostgreSQL, …
Pomimo, że nie jest standardem, to prócz EJB
właśnie Hibernate jest najpopularniejszym
frameworkiem do zapewniania trwałości
Bibliotekę doceniła firma SUN, która tworząc
specyfikację EJB 3.0 wzorowała się na
rozwiązaniach zastosowanych w Hibernate
Rafał Kasprzyk
Biblioteki Hibernate
Pakiet Hibernate można pobrać ze
strony
W skład pakietu wchodzi:
Biblioteka Hibernate: hibernate3.jar
Biblioteki pomocnicze innych dostawców
antlr.jar,
dom4j.jar,
cglib.jar,
commons-collections.jar,
commons-logging.jar,
ehcache-1.1.jar,
Log4j.jar,
asm.jar,
jta.jar,
Rafał Kasprzyk
Warstwa integracji na
Hibernate
Rafał Kasprzyk
Hibernate - cechy
Odpowiedzialny jest za mapowanie klas na
tabele bazodanowe
Pozwala na generowanie schematów bazy
danych
Udostępnia mechanizmy generowania
zapytań, dzięki czemu nie potrzeba
operowania danymi na poziomie SQL i
JDBC
Przyspiesza tworzenie aplikacji poprzez
odciążenie programisty od ręcznej manipulacji
danymi
Posiada bardzo rozbudowane i elastyczne
metody wykonywania poleceń pobierania,
przetwarzania i zapisu danych
HQL (ang. Hibernate Query Language)
Zapytania przez obiekty Criteria i Example
Filtry, Natywny SQL
Rafał Kasprzyk
Hibernate – cechy
Hibernate pozwala wykorzystać
POJO do pełnienia funkcji obiektów
transferowych
Do przekazywania danych pomiędzy
warstwami aplikacji i przesyłania
danych siecią można wykorzystywać
POJO
Klasy trwałe nie musza implementować
żadnych specjalnych interfejsów
W porównania do innych narzędzi
posiadających podobną funkcjonalność
Hibernate w znacznie mniejszym zakresie
wymaga pisania dodatkowego kodu
Praktycznie każda klasa może
reprezentować encję
Rafał Kasprzyk
Hibernate – cechy
Różne techniki poprawiające
wydajność aplikacji komunikującej się
z bazą danych
Buforowania obiektów w pamięci
podręcznej
Obiekty niezmodyfikowane nie są
utrwalane
Do bazy przesyłane są jedynie
zmodyfikowane kolumny
Tzw. opóźnione wykonanie kodu SQL
Mechanizm pozwala na zapis stanu
aktualnego obiektu przy jednokrotnym
odwołaniu się do bazy mimo, ze obiekt był
kilkakrotnie modyfikowany w trakcie
transakcji
Rafał Kasprzyk
Hibernate
- cechy
Hibernate działa na wyższym poziomie
abstrakcji w stosunku do JDO lub EJB
dostarcza mechanizmów tzw.
przezroczystej trwałości (ang.
transparence persistence)
Wsparcie dla wielu standardów
JMX (ang. Java Management Extension)
JTA (ang. Java Transaction API)
…
Świetna współpraca ze Spring
Framework
Spring to obecnie prawdopodobnie
najpopularniejsze środowiskiem rozwoju
aplikacji J2EE
Rafał Kasprzyk
Szczegółowa architektura
Hibernate
Rafał Kasprzyk
Implementacja encji
Encja jest obiektem mającym dla
nas znaczenie, rzeczywistym bądź
wyobrażonym, o którym informacje
muszą być znane lub
przechowywane
użytkownik, faktura, spotkanie,…
Encje implementowane są za
pomocą klas trwałych
Hibernate pozwala na wykorzystanie
POJO w roli klas trwałych, ale
konieczne jest spełnienie pewnych
ograniczeń
Rafał Kasprzyk
Ograniczenia na POJO
Wszystkie pola trwałe muszą być prywatne
Należy stworzyć accessory i mutatory dla
pól trwałych
Musi istnieć bezargumentowy konstruktor
może być domyślny
Jedno z pól powinno pełnić rolę
identyfikatora encji (opcjonalnie)
Hibernate może sam zarządzać
identyfikatorami obiektów, jednak nie jest to
zalecane
Zalecany jest sztuczny identyfikator, typu nie-
prostego
Możliwość przypisania null
Zaleca się stosowanie wspólnego nazewnictwa
np. id
Modyfikator final ogranicza możliwości
strojenia wydajności
Rafał Kasprzyk
Tożsamość obiektu a Hibernate
Hibernate daje możliwość określenia
tożsamość obiektu trwałego w dwojaki
sposób:
Wykorzystanie specjalnie do tego celu
przeznaczonego atrybutu obiektu trwałego
Wartość zwracana w wyniku wywołania
metody session.getIdentifier(Object
o);
Obie metody dają tą samą wartość dla
jednego obiektu
Zaleca się korzystanie z pierwszej
metody, co wymaga:
Dodanie prywatnego atrybutu stanowiącego
identyfikator obiektu wraz ze stosownymi
metodami zapisu i odczytu
Określenie typu identyfikatora obiektu
trwałego w pliku definicji mapowania
Rafał Kasprzyk
Definicja identyfikatora encji
public class User {
private Long id;
…
// pozostałe atrybuty
public Long getId() {
return this.id;
}
private void setId(Long id) {
this.id = id;
}
…
// pozostałe metody setXXX i getXXX
}
<class name="User" table="User">
<id name="id" column="ID" type="long">
<generator class="native" />
</id>
...
</class>
User.hbm.x
ml
User.java
Rafał Kasprzyk
Przykład obiektu trwałego
(encji)
Załóżmy, że chcemy stworzyć katalog
użytkowników
użytkownik to nasza encja
Informacje opisujące użytkownika, które będą nas
interesowały, to jedynie jego identyfikator, imię i
nazwisko
package pl.isolution.hibernate;
public class User {
private Long id;
private String name;
private String surname;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
…
// pozostałe metody setXXX i getXXX
}
Rafał Kasprzyk
API Hibernate
Podstawowe API Hibernate daje
programiście 5 interfejsów, które
stanowią fasadę do mechanizmów
manipulacji trwałymi obiektami
SessionFactory
Session
Transaction
Query
Criteria
Rafał Kasprzyk
API Hibernate
Rafał Kasprzyk
SessionFactory
Realizuje wzorzec AbstractFactory
Odpowiedzialny za stworzenie instancji
klasy implementującej interfejs Session
Obiekt klasy SessionFactory musi być
bezpieczny dla wątków i opatrzony
modyfikatorem final
Zawiera wszelkie informacje na temat
mapowania konkretnych klas na tabele w
bazie danych
Tworzony raz na początku pracy aplikacji
Utworzenie jest kosztowne
Współdzielony przez wiele wątków
Współpracuje z mechanizmem
buforowania obiektów trwałych drugiego
poziomu
Rafał Kasprzyk
SessionFactory (klasa
pomocnicza)
Klasa pomocnicza powinna
implementować wzorzec projektowy
Singloton
public class HibUtil {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration()
.configure().buildSessionFactory();
}catch (Throwable e) {
System.err.println
("Initial SessionFactory creation failed." + e);
throw new ExceptionInInitializerError(e);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
…
//wykorzystanie klasy pomocniczej
SessionFactory sf = HibernateUtil.getSessionFactory();
Rafał Kasprzyk
SessionFactory
(JNDI)
hibernate.cfg.xml
<hibernate-configuration>
<session-factory name =
"java:hibernate/SessionFactory">
...
</session-factory>
</hibernate-configuration>
Tworzenie fabryki sesji (kod
inicjalizujący)
new Configuration().configure().buildSessionFactory();
Wykorzystanie fabryki sesji
InitialContext ic = new InitialContext();
SessionFactory sf = (SessionFactory)
ic.lookup("java:hibernate/SessionFactory");
Rafał Kasprzyk
Session
Jednowątkowy obiekt o stosunkowo krótkim
cyklu życia i zwykle reprezentujący pojedynczą
konwersację z bazą danych
”unit of work”
Tworzenie nie jest kosztowne
Instancja klasy Session jest pełni rolę zarządcy
trwałości obiektów (ang. persistence manager)
Stanowi interfejs do składowania i pobierania
obiektów z bazy danych
Odpowiedzialny za stworzenie instancji klas
implementujących interfejsy
Transaction
Query
Criteria
Współpracuje z mechanizmem buforowania
obiektów trwałych pierwszego poziomu
Rafał Kasprzyk
Session
W przypadku aplikacji internetowych
czas życia obiektu klasy Session
jest nie dłuższy niż czas realizacji
żądania HTTP
”session-per-request”
Uwaga! Obiekt klasy Session biblioteki
Hibernate nie ma nic wspólnego z sesją
aplikacji webowej (HttpSession)
Rafał Kasprzyk
Transakcje Hibernate
Transakcja to zdarzenie lub sekwencja zdarzeń
w wyniku, których wykonanie prowadzi do
przejścia bazy danych z jednego poprawnego
stanu do drugiego
W przypadku niepowodzenia dowolnego ze zdarzeń
stan bazy danych nie zmienia się
Każdą transakcję charakteryzuje:
Niepodzielność (ang. atomicity)
Wykonają się wszystkie operacje, albo żadna
Spójność (ang. consistency)
Wszystkie operacje składające się na transakcje prowadzą
do przejścia z jednego spójnego stanu do drugiego
Izolacja (ang. isolation)
Z punktu widzenia transakcji tylko ona w danym
momencie ma dostęp do bazy danych
Trwałość (ang. durability)
Zatwierdzenie transakcji prowadzi do zapamiętania
wprowadzonych zmian nawet w przypadku awarii systemu
Rafał Kasprzyk
Transaction
Jednowątkowy obiekt transakcji
tworzony przez sesję, którego celem
jest wyznaczenie granic operacji
atomowych
W ramach sesji może zostać
stworzonych kilka kolejnych transakcji
Celem istnienia tego interfejsu jest
abstrahowanie od użytego w aplikacji
mechanizmu sterownia transakcjami
systemowymi takimi jak: JDBC, JTA
Hibernate nie pozwala na
automatyczne zatwierdzanie transakcji
tryb auto-commit nie jest możliwy
Rafał Kasprzyk
Szablon transakcji
Session session = factory.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
//dowolne operacje na obiektach trwałych i sesji
Hibernate
…
transaction.commit();
}
catch (Exception e) {
if (transaction!=null)
transaction.rollback();
session.close();
throw e;
}
finally {
session.close();
}
Rafał Kasprzyk
Query
Obiekty implementujące interfejs
Query reprezentują zapisane i
nazwane zapytania
Pozwalają na manipulacji zapytaniami
definiowanymi w pliku mapowania
obiektowo-relacyjnego
Tworzone są przez obiekt sesji i są
ściśle związane z jej cyklem życia
Za pomocą obiektów zapytań
przekazuje się parametry do
zapytania i odbiera wyniki zapytania
w postaci iteratora bądź listy ze
standardowego API kolekcji Java
Rafał Kasprzyk
Criteria
Obiekty implementujące interfejs
Criteria w przeciwieństwie do
obiektów Query służą przede wszystkim
do dynamicznego budowania zapytań
Doskonale nadaje się do aplikacji, które
dostarczają użytkownikom mechanizmów
zadawania zapytań za pomocą graficznych
kreatorów raportów
Stanowią fasadę do Query API pozwalające
na budowanie dynamicznie złożonych
zapytań do bazy na żądanie użytkownika
Tworzone, podobnie jak obiekty Query,
w ramach sesji i są ściśle związane z jej
cyklem życia
Rafał Kasprzyk
Hibernate – zasada działania
Obiekty, które mają zostać utrwalone
definiowane są w plikach mających
format XML. Pliki te to tzw. pliki
mapowań, które pełnią kilka zadań:
Opisują wszystkie atrybuty obiektów, które
mają zostać utrwalone w bazie relacyjnej, jak
również wszelkiego rodzaju związki pomiędzy
opisywanymi obiektami
Stanowią swego rodzaju składnicę z
informacjami na temat klas, których instancje
będą przechowywane w bazie danych
Pełnią rolę inicjatorów klasy SessionFactory
tworząc kontekst pracy mechanizmu
utrwalania obiektów
Pozwalają na wygenerowanie pliku DDL do
utworzenia schematu bazy danych i
szkieletów klas, których obiekty będą
utrwalane
Rafał Kasprzyk
Hibernate – zasada działania
SessionFactory dostarcza
mechanizmu do zarządzania
instancjami trwałych klas poprzez
interfejs Session.
Interfejs Session jest swego rodzaju
pośrednikiem między wątkiem
aplikacji, a bazą danych.
Zadaniem interfejsu Session jest
ukrywanie szczegółów związanych z
komunikacją, jak również otwieranie i
zamykanie połączenia.
Rafał Kasprzyk
Stany obiektów
Korzystając z Hibernate należy myśleć o
stanie obiektów przetwarzanych przez
aplikację, a nie o wykonywanych poleceniach
SQL
Generowaniem i wysyłaniem poleceń do bazy
danych zajmuje się Hibernate
Inne podejście jest uzasadnione jedynie podczas
strojenia aplikacji
Możliwe stany obiektu:
”ulotny” (ang. transient)
Utworzony ale nie związany z sesją
”trwały” (ang. persistent)
Związany z sesją
Posiada identyfikator i reprezentację w bazie danych
Zmiany na obiektach trwałych są wykrywane przez
Hibernate i synchronizowane ze stanem w bazie danych
”odłączony” (ang. detached)
Obiekt trwały, którego sesja została zakończona
Można go modyfikować, a następnie związać z nową
sesją
Przydatne przy realizacji ”długich transakcji”
Rafał Kasprzyk
Manipulacja obiektami trwałymi
Podstawowe API Hibernate pozwala
na bardzo prostą manipulację
obiektami prostymi (CRUD)
Zapis (ang. Create)
Odczyt (ang. Retrieve)
Aktualizacja (ang. Update)
Usunięcie (ang. Delete)
Hibernate umożliwia również bardzo
zaawansowane wyszukiwanie
obiektów z uwzględnieniem
związków pomiędzy nimi
Rafał Kasprzyk
Utrwalanie obiektu
Aby utrwalić instancję klasy trwałej
należy najpierw utworzyć jej obiekt
W procesie tworzenia obiektu
zwykle nie bierze udział Hibernate
Nie jest to konieczne ponieważ
obiektami utrwalanymi zwykle są POJO
Utrwalanie obiektu dokonuje się za
pomocą metody save(Object obj)
sesji Hibernate w ramach aktywnej
transakcji
Rafał Kasprzyk
Utrwalanie obiektu
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setName("Jan");
user.setSurname("Kowalski");
session.save(user);
transaction.commit();
session.close();
Rafał Kasprzyk
Ładowanie obiektu trwałego
Aby załadować obiekt trwały należy
zastosować metodę
get(Class
clazz,Obiect id)
lub
load (Class
clazz,Obiect id)
sesji Hibernate w
ramach aktywnej transakcji
Pierwszy parametr to klasa obiektu
trwałego
Drugi parametr to identyfikator
Metoda get(…) zwraca wyjątek, gdy
błędny klucz
Metod load(…) zwraca null, gdy
błędny klucz
Rafał Kasprzyk
Ładowanie obiektu trwałego
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
long id = 54321;
User user =
session.get(User.class,new Long(id));
transaction.commit();
session.close();
Rafał Kasprzyk
Aktualizacja stanu obiektu
trwałego
Nie wymaga jakiejkolwiek jawnej
operacji na sesji Hibernate
W ramach otwartej transakcji Hibernate
należy dokonać zmiany stanu obiektu
user.setName("Piotr");
W momencie zatwierdzania transakcji,
zmiany automatycznie zostaną
odwzorowane w bazie danych
Jeśli zmiany mają zostać
natychmiast odwzorowane w bazie
danych należy wywołać metodę
flush() na otwartej sesji
session.flush();
Rafał Kasprzyk
Aktualizacja stanu obiektu
trwałego
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
long id = 777;
User user = session.get(User.class, new Long(id));
user.setName(
"Piotr");
tx.commit();
session.close();
Rafał Kasprzyk
Usunięcie obiektu trwałego
Usunięcie obiektu trwałego polega
usunięcia jego reprezentacji w bazie
danych
Najczęściej sprowadza się do usunięcie
określonego rekordu z bazie danych
Instancja obiektu nie jest usuwana
Obiekt przechodzi ze stanu ”trwały” do stanu
”ulotny”
Referencja wciąż wskazuje na obiekt istniejący
w pamięci maszyny wirtualnej Java
Usunięcie obiektu dokonuje się za pomocą
metody delete(Object obj) sesji
Hibernate w ramach aktywnej transakcji
session.delete(user);
Rafał Kasprzyk
Usunięcie obiektu trwałego
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
long id = 13;
User user = session.get(User.class, new Long(id));
session.delete(user);
transaction.commit();
session.close();
Rafał Kasprzyk
Operacje na obiektach
odłączonych
update()
Synchronizacja z bazą danych stanu
obiektu odłączonego
saveOrUpdate()
save() gdy nowy
update() w przeciwnym przypadku
merge()
Skopiowanie stanu obiektu do trwałej
instancji o tym samym identyfikatorze
Utworzonej
Istniejącej w danej sesji
Załadowanej z bazy danych
Rafał Kasprzyk
Zapytania do bazy danych
Zapytania w HQL (ang. Hibernate Query
Language)
Język syntaktycznie i semantycznie podobny do SQL
SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY,
złączenia, podzapytania (o ile wspiera je DBMS)
Zorientowany obiektowo
Dziedziczenie, asocjacje, …
Zapytania poprzez obiekty Criteria
Zapytania budowane poprzez obiektowe API
Zapytania poprzez obiekty Example
QBE (ang. Query By Example)
Zapytanie budowane w oparciu o przykładową instancję
Filtry
Wykorzystywane do kolekcji i/lub tablic
Zapytania w zwykłym SQL
Możliwość wykorzystania specyficznych konstrukcji np.
CONNECT
Rafał Kasprzyk
Podsumowanie
Podstawowe cechy Hibernate
Architektura Hibernate
Podstawowe API
Zasada działania
Operacje CRUD
Mechanizmy zapytań