当前位置: 首页 > news >正文

hibernate的lazy配置引起的问题

在每一个常见企业应用系统中,我们经常都会把登陆的用户对象User放到session中,而且我们经常都会在action中写一个便捷方法getCurrentUser()方法,有一些经验不足的使用者就会把user传递到service层的接口,有的甚至把该对象传递到DAO层
在使用User对象的引用变量是就会抛出如下的错误,其实这就是跨session访问的一个典型错误。这里有两个解决方式:
1.每次调用service接口时,都只传递userId,在service层内用DAO接口去获得一个新的持久化对象(一个规范化的系统,基本上都是在service层启动新的事务,然后启动一个hibernate session)
2.若觉得上面的方法比较麻烦,则可以在hibernate中把可能访问到的引用变量的配置为lazy="false",这种方法缺点也是很明显的:第一点,到底有多少变量可以设置为lazy="false",我们不得而知。若太多,则丢了性能调优的好处,相当于断了用lazy来进行性能调优的后路;若太少,若再有开发人员访问别的引用变量,为了让自己的代码可以运行起来,那他就会修改lazy的设置(尤其是老手,都会经常用这种不负责任的方法),这就很容易把hibernate配置搞的很混乱;第二点,不清楚这个引用变量是否还有引用变量,若有,是否也要设置,这就搞出了一个无穷无尽的问题。
个人建议:坚决杜绝第二种方法,不能因为这种方法暂时可能会省事(针对单个开发人员,但是对于整个team,没省多少事),但是后患无穷;第一种方法虽然暂时可能会麻烦一点,其实没麻烦多少,但是没有任何遗留问题;
09:54:34,515 ERROR [LazyInitializationException] - <could not initialize proxy - the owning Session was closed>
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:56)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
at com.company.project.domain.system.ShareMode$$EnhancerByCGLIB$$71d9b475.equals(<generated>)
at com.company.project.module.customerserving.dao.CustomerServingDAOImpl.listUnhandledAndDenied(CustomerServingDAOImpl.java:485)
at com.company.project.module.customerserving.service.CustomerServingServiceImpl.listUnhandledAndDenied(CustomerServingServiceImpl.java:354)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:287)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:181)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:148)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
at $Proxy17.listUnhandledAndDenied(Unknown Source)
at com.company.project.module.customerserving.action.CustomerServingAction.listUnhandled(CustomerServingAction.java:506)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.company.project.web.filter.AbstractFilter.doFilter(AbstractFilter.java:56)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
09:54:34,531 ERROR [[action]] - <Servlet.service() for servlet action threw exception>
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:56)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
at com.company.project.domain.system.ShareMode$$EnhancerByCGLIB$$71d9b475.equals(<generated>)
at com.company.project.module.customerserving.dao.CustomerServingDAOImpl.listUnhandledAndDenied(CustomerServingDAOImpl.java:485)
at com.company.project.module.customerserving.service.CustomerServingServiceImpl.listUnhandledAndDenied(CustomerServingServiceImpl.java:354)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:287)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:181)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:148)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
at $Proxy17.listUnhandledAndDenied(Unknown Source)
at com.company.project.module.customerserving.action.CustomerServingAction.listUnhandled(CustomerServingAction.java:506)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.company.project.web.filter.AbstractFilter.doFilter(AbstractFilter.java:56)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)

相关文章:

  • Lua实战之table.remove
  • 老婆说明书
  • cocos2d-lua:改变子节点优先级reorderChild
  • 几天工作中的三个技巧!
  • cocos2d-lua:动作Actions的使用
  • Lua实战之判断连续
  • Lua实战之统计字符串中任意字符出现的次数
  • 用OE收GMAIL信
  • cocos2d-lua:进度条ProgressTimer的使用
  • 用HFNetChk下载更新补丁
  • cocos2d-lua:Label的使用
  • win打开自带的画图工具
  • HR经理必备之IT术语
  • cocos2d-lua:XMLHttpRequest的使用
  • [啃书]身体使用手册 --《You:The owner's manual》
  • 分享一款快速APP功能测试工具
  • (三)从jvm层面了解线程的启动和停止
  • 2017-09-12 前端日报
  • Angular 2 DI - IoC DI - 1
  • echarts的各种常用效果展示
  • Flannel解读
  • interface和setter,getter
  • java8 Stream Pipelines 浅析
  • JavaScript学习总结——原型
  • jquery cookie
  • Python打包系统简单入门
  • select2 取值 遍历 设置默认值
  • vue-cli在webpack的配置文件探究
  • 对象引论
  • 复习Javascript专题(四):js中的深浅拷贝
  • 回流、重绘及其优化
  • 京东美团研发面经
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 树莓派 - 使用须知
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信开放平台全网发布【失败】的几点排查方法
  • 小程序测试方案初探
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • - 转 Ext2.0 form使用实例
  • No resource identifier found for attribute,RxJava之zip操作符
  • Android开发者必备:推荐一款助力开发的开源APP
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • ###C语言程序设计-----C语言学习(6)#
  • #stm32驱动外设模块总结w5500模块
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $jQuery 重写Alert样式方法
  • (06)金属布线——为半导体注入生命的连接
  • (3)STL算法之搜索
  • (30)数组元素和与数字和的绝对差
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354