środa, 14 marca 2012

Hibernate i aplikacje Web

Aby w pełni wykorzystać funkcjonalność leniwego ładowania encji (lazy fetch) jaką daje Hibernate4 w aplikacji webowej Spring MVC można wykorzystać gotowy filtr dostępny w Spring - OpenSessionIvViewFilter. Jego konfiguracja w aplikacji kończy się na dokonaniu następującego wpisu w plik web.xml:

<filter>
<filter-name>sessionFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class&gt
</filter><

<filter>
<filter-name>sessionFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter>

Po jego uaktywnieniu, w przypadku odwołania się do dynamicznie ładowanej kolekcji/obiektu nie powinien się już pojawiać błąd:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

Jednak wykorzystywanie filtra niesie za sobą również pewne problemy. Jak jest napisane w dokumentacji:

WARNING: Applying this filter to existing logic can cause issues that have not appeared before, through the use of a single Hibernate Session for the processing of an entire request. In particular, the reassociation of persistent objects with a Hibernate Session has to occur at the very beginning of request processing, to avoid clashes with already loaded instances of the same objects.

Należy zwrócić szczególną uwagę na wykorzystanie filtra w działających już aplikacjach (może nagle zmienić się ich funkcjonowanie) oraz zwrócić uwagę na możliwe błędy w aktualnie tworzonym kodzie (w szczególności na operacje ponownego przypisania obiektów do sesji Hibernate).