Сделай настолько просто, насколько это возможно, но не проще А. Эйнштейн
Доброе время суток!По просьбе коллег пишу этот пост.
Суть проблеммы:
Когда мы по запросу подтягиваем 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
До новых встреч!)
Читать далее