background image

Podstawowe cechy i API 

Hibernate

Rafał Kasprzyk

background image

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.

background image

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

background image

Rafał Kasprzyk

Biblioteki Hibernate

Pakiet Hibernate można pobrać ze 

strony 

http://hibernate.org

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,

background image

Rafał Kasprzyk

Warstwa integracji na 

Hibernate

background image

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

background image

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ę

background image

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

background image

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

background image

Rafał Kasprzyk

Szczegółowa architektura 

Hibernate

background image

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ń

background image

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 

background image

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

background image

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

background image

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

background image

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

background image

Rafał Kasprzyk

API Hibernate

background image

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

background image

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();

background image

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");

background image

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

background image

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)

background image

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

background image

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

background image

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();

}

background image

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 

background image

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

background image

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

background image

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.

background image

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”

background image

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

background image

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

background image

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();

background image

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

background image

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();

background image

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();

background image

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();

background image

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);

background image

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();

background image

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

background image

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

background image

Rafał Kasprzyk

Podsumowanie

Podstawowe cechy Hibernate

Architektura Hibernate

Podstawowe API

Zasada działania

Operacje CRUD

Mechanizmy zapytań


Document Outline