Pozostałe elementy
Hibernate
Rafał Kasprzyk
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Źródła
Hibernate in Action – wyd. Manning
…
Rafał Kasprzyk