关于spring3中No Session found for current thread!and Transaction的配置和管理(转)

今天我是特别的郁闷,本来项目做到一半,以前都好好的,结果下午就出现问题,苦逼的到现在才解决。它出现问题的时候都一声不坑, 哭
,(天啦,现在才发现CSDN啥时候把QQ表情给整过来了)就在注册用户的时候,咦,后台发现咋SQL语句特么的不对劲,仔细一看数据根本就没有送到数据库去,只是简单的执行了一下查询操作,当时我就震惊了。首先就去看了Action是否没有写save方法,结果是没有任何错误。后来我再去再其他业务层是否也出现了问题,结果都能正常操作尴尬,让我哭笑不得。后来只能查配置。当时我就看到这两个配置是在项目中同时出现的,天啦,我在惊叹,项目以前是怎么运行起来的。

<prop key="hibernate.current_session_context_class">thread</prop>



 

<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>


这两个配置在最新的spring3.1.1和hibernate中4.1.3中都是多余的, 
那是因为在Spring事务管理中,current Session是绑定到SpringSessionContext中的,而不是ThreadLocalSessionContext中的 
而我的事务特性也是在spring配置了的,hibernate也交由了spring管理。spring真是个大管家啊, 
参见这篇文章(很详细):http://blog.csdn.net/irelandken/article/details/7193123

<!--配置事务管理  -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
	
	<!-- 配置事务特性 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			 <tx:method name="exists" read-only="true" /> 
		<tx:method name="save*" propagation="REQUIRED" />   
       <tx:method name="add*" propagation="REQUIRED" />   
        <tx:method name="create*" propagation="REQUIRED" />   
        <tx:method name="insert*" propagation="REQUIRED" />   
        <tx:method name="update*" propagation="REQUIRED" />   
        <tx:method name="merge*" propagation="REQUIRED" />   
        <tx:method name="del*" propagation="REQUIRED" />   
        <tx:method name="remove*" propagation="REQUIRED" />   
        <tx:method name="put*" propagation="REQUIRED" />   
        <tx:method name="use*" propagation="REQUIRED"/>   
        <!-- hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到    -->
        <tx:method name="get*" propagation="REQUIRED" />   
        <tx:method name="count*" propagation="REQUIRED" read-only="true" />   
        <tx:method name="find*" propagation="REQUIRED" read-only="true" />   
        <tx:method name="list*" propagation="REQUIRED" read-only="true" />  
         <tx:method name="*" propagation="REQUIRED" /> 
			
		</tx:attributes>
	</tx:advice>

	
	<!-- 配置哪些类的方法进行事务管理 -->
	<aop:config proxy-target-class="true">
		<aop:pointcut id="bussinessService" expression="execution(* com.shop.service..impl.*.*(..))" />
		<aop:advisor pointcut-ref="bussinessService" advice-ref="txAdvice" />
	</aop:config>
	<aop:config proxy-target-class="true">
		<aop:pointcut id="dao" expression="execution(* com.shop.dao.*.*(..))" />
		<aop:advisor pointcut-ref="dao" advice-ref="txAdvice" />
	</aop:config>


在以上的很多实验中出现了怪多的异常: 
org.hibernate.HibernateException: No Session found for current thread 
因为我在项目中一直都是作用的getCurrentSession,也没有在业务方法中进行事务管理,出现上面这个错误的原因就是在使用getCurrentSession的时候找不到相应的事务,所以No session就出来了,记住,并不是因为

<prop key="hibernate.current_session_context_class">thread</prop>


这个配置,所以一定要配置好事务管理。 
在后面还出现了类似的: 
org.hibernate.HibernateException: save is not valid without active transacti 
只要把上面的问题解决了这个问题也解决了, 
总结:使用最新的spring和hibernate记住干掉上面那两个配置和配置正确相应的Transaction。

posted @ 2015-01-18 15:09  逐客教我  阅读(383)  评论(0编辑  收藏  举报