вторник, 9 февраля 2010 г.

Борьба с hibernate LazyInitializationException

Сделай настолько просто, насколько это возможно, но не проще А. Эйнштейн
Доброе время суток!
По просьбе коллег пишу этот пост.
Суть проблеммы:
Когда мы по запросу подтягиваем hibernate сущность содержащую поля инициализирующиеся как Lazy, и пытаемся отобразить эти поля например на странице, то мы получаем LazyInitializationException.

Причина проблемы:
В момент обращения к сущности на странице, сессия уже закрыта и сущность находится в так называемом detached состоянии (более подробно о состояниях тут), отсюда то нам и не удается запросить у сущности её Lazy поля.
Решение:
Решение этой проблемы напрашивается само, сессию нужно держать открытой до тех пор пока не отдадим страницу.
Так как мы используем spring то и решение этой проблемы, будет расмотрено в рамках spring.
Необходимо добавить в свой web.xml spring'овый фильтр который и будет держать сессию открытой.
Вот как это выглядит:

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.htm</url-pattern>
</filter-mapping>

Здесь sessionFactory это имя той hibernate фабрики которую вы инициализировали в своем application context'е.

Ну вот собственно и все, после объявления данного фильтра никаких LazyInitializationException поидее у вас быть не должно =).

По этой же теме hibernate community

До новых встреч!)

Читать далее