spring在MVC层解决JPA的缓迟加载问题 - 编程入门网
的事务是配置在service层的,因此在执行service.queryDirsByConditions方法完成后就关闭了事务。因此运行程序就会出现类似下面的错误信息:
2007-03-28 00:39:35,750 ERROR [org.hibernate.LazyInitializationException] - failed to lazily initialize a collection of role: com.easyjf.cms.domain.NewsDir.children, no session or session was closedorg.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.easyjf.cms.domain.NewsDir.children, no session or session was closedat org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:97) 使用其它的mvc如struts、webwork乃至spring mvc都会有这样的问题,问题的核心是在事务启动及结束上,由于我们都习惯于在service层而非mvc配置及使用事务,导致了这样的问题。解决的办法其实很简单,就是把事务的启动放到mvc层,让mvc层的controller来开启事务,而让业务层的方法加入的事务中。比如,在EasyJWeb中,可以通过如下的配置来实现实现在action中开启事务:在Spring配置文件中配置EasyJWeb的核心处理器,并把process方法添加到事务中,配置文件如下: <aop:config><aop:pointcut id="easyjwebProcessor"expression="execution(* com.easyjf.web.RequestProcessor.process(..))" /><aop:advisor advice-ref="txEasyjwebProcessorAdvice"pointcut-ref="easyjwebProcessor" /></aop:config><tx:advice id="txEasyjwebProcessorAdvice"transaction-manager="transactionManager"><tx:attributes><tx:method name="*" propagation="REQUIRED" read-only="true" /></tx:attributes></tx:advice><bean name="EasyJWeb-Processor" class="com.easyjf.web.core.DefaultRequestProcessor"/>只需要这样简单的配置,你会惊奇的发现,所有缓迟加载及其它由Persitence Context无效而引起的问题均解决了。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |