|
Strona główna Zbieranina Serwisy Porady Projekty Humor sektora IT TODO Nowości Ostatnie zmiany Kontakt Find pages
Set your name in
UserPreferences Referenced by
JSPWiki v2.2.33
|
Hibernate ToolsIstnieje wiele bibliotek do pracy z Hibernate Table of ContentsJakie miałem potrzebyMiałem kod który mógł być wykonywany zarówno jako aplikacja webowa jak i aplikacja serwerowa dostępna poprzez RMI. W aplikacjach webowych zwykle stosuje się wzorzec OpenSessionInView (jedna sesja Hibernate na cały request klienta). W aplikacjach serwerowych zwykle otwiera się sesję na każde wywołanie metody (chyba, że kod bierze udział w jakiejś większej transakcji, EJB chociażby). Dodatkowo musiałem też opracować mechanizm pozwalający na przepisanie obiektów zwracanych przez Hibernate (zawierających odwołania lazy loading) do postaci akceptowanej w wyższych warstwach, bez dostępu do sesji Hibernate. Z kolei gdy aplikacja pracowała w wersji dwuwarstwowej takie przepisywanie nie było konieczne. Potrzebowałem sposobu aby w elegancki i prosty sposób móc przełączać zachowanie kodu pomiędzy takimi przypadkami. RozwiązanieZa dostarczanie poprawnego obiektu Session odpowiedzialne są implementacje interfejsu
SessionProvider Całą logikę interakcji z Hibernate zawieramy w instancjach abstrakcyjnej klasy Command Klasa HibernateTemplate pozwala na zdefiniowanie klasy mogącej reagować na odpowiednie zdarzenia w trakcie operacji z bazą danych. Realizowane jest to poprzez implementacje interfejsu SessionInterceptor Jako bonus dostępna jest klasa filtra serwletów Lista zmian
Dokumentacja
Kody źródłoweModuł HibernateTools w repozytorium CVS
PrzykładySuchy opis jest mało przydatny, poniżej są próbki kodu pokazujące użycie biblioteki. Na samym początku pracy (w przypadku aplikacji webowej najlepiej zrealizować to w implementacji ServletContextListener) należy oczywiście zainicjalizować Hibernate. Służy do tego celu usługowa klasa HibernateUtil Praca w trybie każdorazowego pobierania nowej sesji
HibernateTemplate hibernate = new HibernateTemplate();
hibernate.setSessionProvider(new NewSessionProvider());
hibernate.setSessionInterceptor(new SingleSessionInterceptor());
Object result = hibernate.action(new Command() {
public Object action() {
return session.get(MyDomainObject.class, someId);
}
});
Przykład jest banalny ;-) Ale pokazuje co możemy zrobić dalej. Poprzez prostą podmianę klasy SessionProvider możemy dostosować aplikację do pracy z bieżącymi sesjami wzorca OpenSessionInView. Przygotowanie obiektów do przesłania do wyższych warstw
HibernateTemplate hibernate = new HibernateTemplate();
hibernate.setSessionProvider(new NewSessionProvider());
hibernate.setSessionInterceptor(new SingleSessionInterceptor());
DTOAssembler assembler = new GenericAssembler() {
protected Object assembleElement(Object o) {
((MyDomainObject)o).setParent(null);
return o;
}
};
Object result = hibernate.action(new AssembledCommand(assembler) {
public Object action() {
return session.createQuery("from MyDomainObject").list();
}
});
Ten równie banalny przykład pokazuje, jak za pomocą implementacji DTOAssembler
|
||||||