background image

Pozostałe elementy 

Hibernate

Rafał Kasprzyk

background image

Wykorzystanie adnotacji

Adnotacje to metadane, które mogą 

być stosowane dla pakietów, klas, 

atrybutów, metod, parametrów, a 

nawet zmiennych

Adnotacje maja postać pary 

nazwa=wartość. Do dyspozycja są 

typy adnotacji wbudowane w język 

Java, ale można również definiować 

własne niestandardowe typy 

adnotacji

Rafał Kasprzyk

background image

Metadane Hibernate

@hibernate.class 

table = nazwa_tabeli

@hibernate.id

column = nazwa_kolumny

generator-class = native

@hibernate.property

column = nazwa_kolumny

length = rozmiar_kolumny

not-null = true|false

Rafał Kasprzyk

background image

Metadane Hibernate

@hibernate.bag

lazy = true|false
order-by = pole_sortujace

@hibernate.collection-key

column = 

kolumna_klucza_obcego

@hibernate.collection-one-to-

many
class = klasa_bedaca_w_relacji

Rafał Kasprzyk

background image

Metadane Hibernate

@hibernate.many-to-one

column = kolumna_klucza_obcego

not-null = true|false

@hibernate.set

table = nazwa_tabeli_intersekcji

lazy = true|false

@hibernate.collection-key

column = kolumna_klucza_obcego

@hibernate.collection-many-to-

many

class = klasa_na_koncu_asocjacji

column = kolumna_klucza_obcego

Rafał Kasprzyk

background image

Przykład klasy z metadanymi

/**

* @hibernate.class

* table="Person"

*/

public class Person {

private Long id;

private String name;

/*

* @hibernate.id

* generator-class="native"

* column="ID"

*/

public Long getId() { return id;}

private void setId(Long id) { 

this.id=id;

}

/*

* @hibernate.property

* column="NAME"

*/

public String getName() { return id;}

private void setName(Name name) {

this.name=name;

}

}

Rafał Kasprzyk

background image

XDoclet i Hibernate

XDoclet jest narzędziem, 

generującym kod na podstawie 

metadanych umieszczonych w 

komentarzach JavaDoc.

Na podstawie adnotacji XDoclet 

pozwala na wygenerowanie plików 

mapowań dla każdej klasy trwałej

Rafał Kasprzyk

background image

Idea słuchaczy

Często pożądanym okazuje się możliwość 

reakcji na zdarzenie generowane przez 

Hibernate:

Możliwość audytu, modyfikacji obiektu przed 

zapisem

np. ustawienie daty aktualizacji

Sprawdzenie spójności obiektu

Weryfikacja pobieranych danych

W wersji 3 biblioteki Hibernate, każda akcja 

generuje odpowiadające jej zdarzenie z 

którym można związać dowolną liczbę 

obiektów nasłuchujących (ang. listener)

Istnieje dokładnie 25 typów zdarzeń posiadających 

możliwość dowiązania stosownego słuchacza

PreDeleteEvent, PreInsertEvent, PreLoadEvent, 

PreUpdateEvent

PostDeleteEvent, PostInsertEvent, PostLoadEvent, 

PostUpdateEvent

EventListener, DeleteEvent, FlushEvent, 

LoadEvent, MergeEvent, SaveOrUpdateEvent, …

Rafał Kasprzyk

background image

Przykład wykorzystania 

słuchacza

Instalacja słuchacza odbywa się 

deklaratywnie

<listener type="post-load" class =        

"pl.isolution.hibernate.util.LoggingEventListener"/

>

Kod słuchacza realizujący pobranych 

obiektów trwałych może przyjąć 

następującą postać 

public class LoggingEventListener      

implements 

PostLoadEventListener{
private static final Log log =
   LogFactory.getLog(LoggingEventListener.class);
public void onPostLoad(PostLoadEvent event) {
   Log.inf(event.getEntity());
}

}

hibernate.cf
g.xml

Rafał Kasprzyk

background image

Ograniczenia mechanizmu 

słuchaczy

Brak jest niestety możliwości 

konfiguracji mechanizmu słuchaczy 

dla każdego obiektu trwałego 

osobno

Możliwe rozwiązania tego problemu:

Stosowanie instrukcji if-else

Wykorzystanie wzorca projektowego 

Controller do implementacji słuchacza 

z listy zainstalowanych słuchaczy dla 

każdego typu encji

Rafał Kasprzyk

background image

Transakcje J2EE w Hibernate

Transakcje mają ogromne znaczenie praktyczne

Umożliwiają synchronizację mechanizmu utrwalania 

obiektów z bazą danych 

API udostępniane przez Hibernate jest niezależne 

od użytego w aplikacji typu transakcji

Hibernate dostarcza trzy strategie:

org.hibernate.transaction.JDBCTransactionFacto

ry

Transakcja realizowana bezpośrednio na bazie danych tj. poza 

środowiskiem J2EE

org.hibernate.transaction.JTATransactionFactory

Transakcja zarządzana przez kontener (ang. Container 

Management Transaction – CMT) jeżeli istnieje już transakcje 

w tym kontekście, w przeciwnym przypadku tworzona jest 

transakcja zarządzana przez komponent (ang. Bean 

Management Transaction – BMT) 

org.hibernate.transaction.CMTTransactionFactor

y

Transakcje realizowane przez kontener (CMT)

Rafał Kasprzyk

background image

Transakcje J2EE w Hibernate

Wyboru strategii dokonuje się w pliku 

hibernate.cfg.xml korzystając z własności 

transaction.factory_class

Kolejnym krokiem jest odnalezienie menedżera 

transakcji niezbędnego do pobrania aktualnego 

kontekstu transakcji i ewentualnej rejestracji 

uczestnika transakcji

Hibernate dostarcza odpowiednich wyszukiwaczy, którego 

wybór dokonuje się w pliku hibernate.cfg.xml korzystając 

z własności transaction.manager_lookup_class

JBoss

org.hibernate.transaction.JBossTransactionManagerLookup

WebLogic

org.hibernate.transaction.WebLogicTransactionManagerLookup

WebSphere

org.hibernate.transaction.WebSphereTransactionManagerLooku

p

Rafał Kasprzyk

background image

Transakcje J2EE w Hibernate

Hibernate w wersji 3 uwalnia 

programistę od konieczności 

samodzielnej synchronizacji i zapisu 

do bazy danych

Programista nie musi się martwić o 

niespójność cache pierwszego poziomu 

oraz zamykanie sesji w odpowiednim, 

odpowiedni ustalonym miejscu

Dzięki integracji Hibernate z JTA 

dostajemy mechanizm automatycznej 

rejestracji jako uczestnik transakcji

Rafał Kasprzyk

background image

Transakcje J2EE w Hibernate

Aktywacja mechanizmy 

automatycznego procesu 

synchronizacji i zapisu do bazy 

danych

<property name = 

transaction.flush_before_completion>
 true

</property>

<property name = 

transaction.auto_close_session>
true

</property>

hibernate.cf
g.xml

Rafał Kasprzyk

background image

Zapewnianie bezpieczeństwa w 

Hibernate

Hibernate w wersji 3 wprowadza model 

deklaratywnego bezpieczeństwa na poziomie 

zdarzeń i encji

Mechanizm bezpieczeństwa zbudowany został w 

oparciu o idee słuchaczy i korzysta ze 

specyfikacji JACC (ang. Java Authorization 

Contract for Container)

Autoryzacja odbywa się poprzez JAAS (ang. Java 

Authentication and Authorization Service), a 

konfiguracja znajduje się w pliku 

hibernate.cfg.xml

Mechanizm zapewniania bezpieczeństwa 

dostarczany przez Hibernate jest jeszcze w fazie 

rozwoju i na razie nie została dostrzeżona przez 

liczną społeczność korzystającą z Hibernate

Rafał Kasprzyk

background image

Przykład zabezpieczeń

Instalacja dedykowanego słuchacza JACC

<listener type= "pre-insert" class =
 

org.hibernate.secure.JACCPreInsertEventListene

r/>

Przypisanie uprawnień do 

poszczególnych ról odpowiadającym tym, 

które zostały zdefiniowane przez 

dostawcę JACC

<grant role = "admin" 

entity-name = "pl.isolution.hibernate.Employee" 
action = "insert, update, read" />

hibernate.cf
g.xml

hibernate.cf
g.xml

Rafał Kasprzyk

background image

Hibernate Tools

Zbiór narzędzi, które ułatwiają 

korzystanie z biblioteki Hibernate

Dostępne są w postaci

Zadań Ant

Zbioru wtyczek do środowiska Eclipse

Całość dostępna jako JBoss IDE Eclips

Rafał Kasprzyk

background image

Funkcjonalność Hibernate Tools

Inżynieria w przód

W oparciu o klasy trwałe generowane są: 

schemat bazy danych, pliki *.hbm.xml i plik 

konfiguracyjnego hibernate.cfg.xml

Inżynieria wstecz

W oparciu o istniejący schemat bazy danych 

generowane są: klasy POJO, pliki *.hbm.xml i 

plik konfiguracyjnego hibernate.cfg.xml

Edytor konfiguracji i odwzorowań 

Uzupełnianie i kolorowanie kodu

Interaktywne zapytania HQL (HQL 

Scratchpad)

Wykonanie zapytania ad-hoc i podgląd jego 

translacji do SQL

Rafał Kasprzyk

background image

Podsumowanie

Na dzień dzisiejszy prawdopodobnie 

najpopularniejszy ORM (1500 pobrań 

dziennie)

Bardzo dużo materiałów

Udział twórców Hibernate w pracach nad 

specyfikacją EJB 3.0

Cykl wydawniczy kolejnych wersji wynoszący 

około 3 tygodnie wskazuje, że biblioteka jest 

intensywnie rozwijana i udoskonalana

Według dokumentacji celem Hibernate 

jest zwolnienie programisty aplikacji z 

konieczności kodowania ponad 95% 

zadań związanych z zapewnieniem 

trwałości danych

Rafał Kasprzyk

background image

Źródła

www.google.com

 

www.hibernate.org

www.jboss.org

Hibernate in Action – wyd. Manning

Rafał Kasprzyk


Document Outline