Как я могу предотвратить появление исключений LazyInitializationException при многократном запросе страницы?Если я просто удерживаю Ctrl-R на странице в моем веб-приложении, я последовательно получаю это сообщение в моих файлах журнала.
В моем файле servlet.xml настроен следующий перехватчик:
<mvc:interceptors>
<bean
class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor" />
</mvc:interceptors>
Тем не менее, я постоянно получаю следующие ошибки:
2011-09-23 15:14:28,854 [http-8080-23] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/web-app].[springmvc] - Servlet.service() for servlet springmvc threw exception
org.hibernate.LazyInitializationException: illegal access to loading collection
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:366)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:186)
Примечание. Включение ведения журнала на перехватчике Я ясно вижу, что он вызывается и открывает / закрывает транзакции:
2011-09-23 15:36:53,229 [http-8080-5] DEBUG org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor IP134.167.141.34 CV#ef955014-cc9d-42fc P#75004 - Opening single Hibernate Session in OpenSessionInViewInterceptor
2011-09-23 15:36:53,229 [http-8080-5] WARN eqip.core.springmvc.extensions.interceptors.AbstractAgencyDataInterceptor IP134.167.141.34 CV#ef955014-cc9d-42fc P#75004 - Pre handle: http://134.167.141.34:8080/web-app/main.xhtml Status: 200
2011-09-23 15: 36: 53,511 [http-8080-5] WARN org.hibernate.engine.StatefulPersistenceContext.ProxyWarnLog IP134.167.141.34 CV # ef955014-cc9d-42fc P # 75004 - Сужение прокси для класса core.model.entities.Subclass - эта операция прерывается == 2011-09-23 15: 36: 53,511 [http-8080-5] WARN org.hibernate.engine.StatefulPersistenceContext.ProxyWarnLog IP134.167.141.34 CV # ef955014-cc9d-42fc P # 75004- Сужение прокси до класса core.model.entities.Subclass - эта операция прерывается == 2011-09-23 15: 36: 53,916 [http-8080-5] DEBUG org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor IP134.167.1410,34CV # ef955014-cc9d-42fc P # 75004 - сброс одного сеанса гибернации в OpenSessionInViewInterceptor 2011-09-23 15: 36: 53,916 [http-8080-5] DEBUG org.springframework.web.servlet.DispatcherServlet IP134.167.141.34 CV# ef955014-cc9d-42fc P # 75004 - Представление рендеринга [eqip.core.springmvc.extensions.velocity.VelocityToolsLayoutView: name 'pages / myEqip';URL [pages / main.xhtml]] в DispatcherServlet с именем 'springmvc' 2011-09-23 15: 36: 54,213 [http-8080-5] DEBUG eqip.core.springmvc.extensions.velocity.VelocityToolsLayoutView IP134.167.141.34CV # ef955014-cc9d-42fc P # 75004 - Шаблон содержимого экрана рендеринга [pages / main.xhtml] 2011-09-23 15: 36: 54,384 [http-8080-5] DEBUG org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor IP134.167.141.34 CV # ef955014-cc9d-42fc P # 75004 - Закрытие одного сеанса Hibernate в OpenSessionInViewInterceptor
Использование Spring 3.0.5, Hibernate 3.6.5, скорость 1.7
Окончательное исправление : добавлено следующее в декларации нашего контроллера:
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
Это позволило нам продолжать использовать наши перехватчики и получать новые копии предварительно загруженных фрагментов на каждомзапрос.