java - 刷新引起的延迟初始化错误

标签 java hibernate spring spring-mvc velocity

如何防止多次请求页面时抛出 LazyInitializationExceptions?如果我只是在我的 web 应用程序的页面上按住 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.141.34 CV#ef955014-cc9d-42fc P#75004 - Flushing single Hibernate Session in OpenSessionInView拦截器 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 - 渲染 View [eqip.core. springmvc.extensions.velocity.VelocityToolsLayoutView: 名称 'pages/myEqip'; DispatcherServlet 中名称为“springmvc”的 URL [pages/main.xhtml]] 2011-09-23 15:36:54,213 [http-8080-5] 调试 eqip.core.springmvc.extensions.velocity.VelocityToolsLayoutView IP134.167.141.34 CV#ef955014-cc9d-42fc P#75004 - 渲染屏幕内容模板 [页面/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 session OpenSessionInViewInterceptor

使用 Spring 3.0.5,Hibernate 3.6.5,速度 1.7

最终修复:将以下内容添加到我们的 Controller 声明中:

@Scope(BeanDefinition.SCOPE_PROTOTYPE) 

这使我们能够继续使用我们的拦截器,并确保我们在每次请求时都能获得预加载片段的新副本。

最佳答案

可能是您在 session 中保存了一些 hibernate 对象,这些对象可能具有未初始化的代理。

每次按下 Ctrl+R 时,都会打开新请求,并且无法在当前请求期间从上一个请求初始化代理对象,因此会引发 LazyInitializationException 异常。

如果这不是你的情况,那么试着往这个方向挖掘。

关于java - 刷新引起的延迟初始化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7533789/

相关文章:

java - Java Spring如何查询MongoDB?

java - java.util.zip.Deflater 和 java.util.zip.Inflater 类线程安全吗

spring hibernate 和使用 ehcache 进行缓存

java - 子流调用在 Spring webflow 中不起作用

Java:Eclipse:Setter、Getter 以及在另一个类中使用变量

java - 当我导入 jdl 文件时,仅生成客户端

java - Hibernate-Spring Security-Spring MVC版本

java - 具有继承性的实体的 JPA native 查询

java - IntelliJ IDEA 16 添加maven依赖到类路径

java - 如何使用 Spring Batch 并行步骤分割流配置上述用例?