zoukankan      html  css  js  c++  java
  • 关于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。

  • 相关阅读:
    十四、内存泄露和强软弱虚引用
    十五、对象的内存布局
    Android Service全解(三)之 Foreground Service(转)
    android中不同activity的传参调用和返回
    Android Service全解(一)之 startService(转)
    Android Service全解(二)之 bindService(转)
    android单点、多点触控之MotionEvent
    关于创建进程函数CreateProcess()字符串参数的说明
    sql中连接两个不同的数据库(A在同一个服务器,B不在一个服务器)
    asp.net小数点四舍五入的方法
  • 原文地址:https://www.cnblogs.com/jiligalaer/p/4231792.html
Copyright © 2011-2022 走看看