`

spring3.1.3整合hibernate3.6.4session报错

 
阅读更多

spring3.1.3整合hibernate3.6.4,在使用hibernate getCurrentSession()方法时,总是报如下错误:

 

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

 

说明:如果使用openSession()是没有问题的,但是openSession()是不推荐使用的,推荐使用的是getCurrentSession(),(在hibernate4中已完全实现事务,所以spring3.1整合hibernate4时已经不提供HibernateDaoSupport,HibernateTemplete类了,只能用hibernate原始的方式用session(具体参考:http://loushi135.iteye.com/blog/1420309))

 

所以我们需要解决这个问题,当然由于公司项目中使用的还是hibernate3,故本文使用的是公司项目的版本

具体报错信息如下

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
	at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
	at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
	at com.cxl.demo.dao.impl.UserDaoImpl.getSession(UserDaoImpl.java:27)
	at com.cxl.demo.dao.impl.UserDaoImpl.getUserByName(UserDaoImpl.java:44)
	at com.cxl.demo.service.impl.UserServiceImpl.getUserByName(UserServiceImpl.java:26)
	at com.cxl.demo.controller.LoginController.loginDeal(LoginController.java:28)
	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:597)
	at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:100)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:604)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:565)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Thread.java:619)

 

需要配置事务,故关于事务的配置如下

<!-- 事务配置管理器 -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	
	<!-- 配置事务的传播特性 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">	
		<tx:attributes>
			<!--定义参与事务的方法 read-only="true" 脏数据只读,提高效率-->
			<tx:method name="get*" read-only="true" propagation="SUPPORTS" />
			<tx:method name="query*" read-only="true" propagation="SUPPORTS" />
			<tx:method name="find*" read-only="true" propagation="SUPPORTS" />
			<tx:method name="load*" read-only="true" propagation="SUPPORTS" />
			<tx:method name="*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>

 但是依然报错,解决方案如下

1.在配置文件中配置下面的配置

<aop:config proxy-target-class="true">
		<aop:advisor pointcut="execution(* com.cxl.demo..*Service.*(..))" advice-ref="txAdvice" />
	</aop:config>

 

 此时就可以了,而且这样就不需要在service层加上@Transactional了

 

2.另一种解决方案是基于注解驱动的配置(在applicationContext.xml)

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

 此时需要在service层加上@Transactional

基于注解驱动的配置要注意spring的配置,如果使用项目使用的是springmvc+hibernate时,一般会有两个spring配置文件,一个是applicationContext.xml和springmvc的相关配置文件,此时需要在applicationContext.xml将Controller的注解排除掉

<!--将Controller的注解排除掉 让@Transactional( rollbackFor={Exception.class})事务管理起作用-->
	<context:component-scan base-package="com.cxl.demo">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
	</context:component-scan>

 

在springmvc中将Controller的注解加入进来,并把Service注解给去掉

 

<context:component-scan base-package="com.cxl.demo">
	 <!--在主容器中(applicationContext.xml),将Controller的注解去掉,在子容器中要加上   -->
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
		<!-- springMVC配置文件中将Service注解给去掉  -->
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>

 注:事务是配置在applicationContext.xml中,不要配置在springmvc中,完毕!

分享到:
评论

相关推荐

    SSH框架整合struts2.3.4+spring3.1.3+Hibernate4.1.4

    SSH框架整合是Web开发中常用的一种技术组合,它由Struts2、Spring和Hibernate三个开源框架组成,分别负责表现层、业务层和服务层的管理。本文将深入探讨SSH框架整合的具体过程及其在实际项目中的应用。 首先,...

    spring3.1.3源码开发jar包

    在"projects"目录下,可能包含了Spring框架的不同子项目或者示例项目,这些可以帮助我们了解如何在实际应用中整合和使用Spring。这些项目可能包含了Spring MVC的示例,展示了如何处理HTTP请求,以及如何使用Spring的...

    spring3.1.3 release

    在【标题】"spring3.1.3 release" 中,我们关注的是 Spring 框架的 3.1.3 版本,这是一个稳定版本。相较于描述中提到的 3.2 版本,尽管它是较新的,但可能还处于测试阶段,因此选择 3.1.3 是为了确保稳定性和可靠性...

    spring3.1.3源码

    5. **数据访问集成**: Spring 3.1.3增强了对JDBC、ORM(如Hibernate、JPA)和O/R映射的支持。在`org.springframework.jdbc`和`org.springframework.orm`包中,可以看到Spring如何简化数据库操作和对象持久化的代码。...

    SSH.zip_Java 8_spring3.1.3_ssh

    SSH.zip_Java 8_spring3.1.3_ssh 是一个包含Java 8、Spring 3.1.3和SSH(Struts2、Spring、Hibernate)整合开发的压缩包资源。这个项目模板提供了使用这三个核心技术栈进行Web应用程序开发的基础框架。 1. **Java 8...

    spring3.1.3技术文档

    Spring 3.1.3还包括了对Hibernate 4.x的支持,这体现了Spring对当下流行的ORM框架的兼容性。同时,还提供了对@Configuration类和@Profile注解的支持,允许开发者根据不同的环境定义不同的Bean。 在测试方面,Spring...

    ThinkPHP3.1.3_redis_Storage_session:ThinkPHP3.1.3使用redis存储session

    ThinkPHP3.1.3使用redis存储sessionThinkPHP3.1.3使用redis存储session步骤:1.配置文件修改'SESSION_TYPE' =&gt; 'Redis', //session保存类型'SESSION_PREFIX' =&gt; 'Sess_', //session前缀'REDIS_HOST' =&gt; '127.0.0.1',...

    Spring3.1.3 Ioc在Web容器中的建立

    标题 "Spring3.1.3 Ioc在Web容器中的建立" 涉及的是Spring框架的一个关键特性——依赖注入(Dependency Injection,简称DI),以及如何在Web应用环境中配置和使用它。Spring是Java开发中最流行的轻量级框架之一,...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    spring整合redis(spring模板+连接池+json序列化+cluster集群).zip

    本篇文章将深入探讨如何在Spring项目中整合Redis,包括使用Spring模板、连接池、JSON序列化以及设置Redis集群。 1. **Spring模板**: Spring的`RedisTemplate`是操作Redis的主要工具,它提供了一套完整的API来执行...

    Spring Security 3.1.3配置实例

    Spring Security 是一个强大的且高度可定制的...总之,Spring Security 3.1.3配置实例提供了对用户认证、授权、安全控制的实践操作,通过理解并应用这些配置,开发者可以有效地保护自己的应用程序免受潜在的安全威胁。

    struts.hibernate.spring整合jar包大全

    Spring 3.1.3版本加强了对其他框架如Struts和Hibernate的整合,提供了更完善的事务管理,并引入了新的注解,如`@Async`和`@Scheduled`,以支持异步任务和定时任务。 **SSH整合关键知识点** 1. **依赖注入(DI)与...

    SpringSecurity3.1.3 Demo

    SpringSecurity3.1.3 + JDK1.7 + Maven3.3.3 + Jetty9,提供基本的pom.xml,applicationContext.xml,web.xml配置和jetty插件的配置

    springframework-3.1.3

    《Spring 框架 3.1.3 版本详解》 在IT领域,Spring框架作为Java开发的基石,其重要性不言而喻。本文将深入探讨Spring框架3.1.3版本的核心组件与功能,以帮助开发者更好地理解和应用这一强大的框架。 Spring框架是...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    基于Spring的注册登录系统

    该项目基于Spring 3.1.3, Spring MVC, Hibernate 4.1.7, EhCache, Spring Data JPA 1.1.0, MySQL 5, Spring Security 3.1.3, Spring Mail, Recapcha等技术实现了网站注册、登录系统。项目包含了详尽的配置信息。 ...

    springSecurity3.1.3.rar

    springSecurity springSecurity3.1.3

    spring security 3.1.3 源码含sample源码

    这个压缩包提供了Spring Security 3.1.3的源码,以及一个名为"sample"的示例项目,帮助开发者理解和学习如何在实际应用中使用这个库。 **1. Spring Security的基本架构** Spring Security基于过滤器链的概念,其...

    springsecurity3.1.3 案例

    在这个"Spring Security 3.1.3案例"中,我们将探讨这个版本的一些核心概念和特性,以及如何利用它们来保护你的应用程序。 首先,让我们了解Spring Security的基本架构。它主要由四个主要组件组成:认证、授权、访问...

    SpringSecurity3.1.3的jar包

    这个压缩包包含了Spring Security 3.1.3版本的多个核心组件和示例项目,以下是各组件的主要功能和相关知识点: 1. **spring-security-core-3.1.3.RELEASE.jar**:这是Spring Security的核心模块,它提供了基本的...

Global site tag (gtag.js) - Google Analytics