关于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。

时间: 2024-08-17 14:37:34

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

Hibernate4 No Session found for current thread

Hibernate4 与 spring3 集成之后, 如果在取得session 的地方使用了getCurrentSession, 可能会报一个错:“No Session found for current thread”, 这个错误的原因,网上有很多解决办法, 但具体原因的分析,却没有多少, 这里转载一个原理分析: SessionFactory的getCurrentSession并不能保证在没有当前Session的情况下会自动创建一个新的,这取决于CurrentSessionContext的实现

SSH2 No Session found for current thread原因

Hibernate4 与 spring3 集成之后, 如果在取得session 的地方使用了getCurrentSession, 可能会报一个错:"No Session found for current thread", 这个错误的原因,网上有很多解决办法, 但具体原因的分析,却没有多少, 这里转载一个原理分析: SessionFactory的getCurrentSession并不能保证在没有当前Session的情况下会自动创建一个新的,这取决于CurrentSessionConte

Hibernate4 No Session found for current thread原因

Hibernate4 与 spring3 集成之后, 如果在取得session 的地方使用了getCurrentSession, 可能会报一个错:“No Session found for current thread”, 这个错误的原因,网上有很多解决办法, 但具体原因的分析,却没有多少, 这里转载一个原理分析: SessionFactory的getCurrentSession并不能保证 在没有当前Session的情况下会自动创建一个新的,这取决于CurrentSessionContext的实

hibernate在使用getCurrentSession时提示no session found for current thread

大致错误片段 org.hibernate.HibernateException: No Session found for current thread at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) 大致问题:hibernate在处理sessoin SessionFactory的getCurrentSession并不能保证在没有当前Se

spring+hibernate整合:报错org.hibernate.HibernateException: No Session found for current thread

spring+hibernate整合:报错信息如下 org.hibernate.HibernateException: No Session found for current thread at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106) at org.hibernate.internal.SessionFactoryImpl.getC

分析 org.hibernate.HibernateException: No Session found for current thread

/**      *      * org.hibernate.HibernateException: No Session found for current thread      * 分析:getCurrentSession()和当前事务有关系      *      * Spring hibernate 事务的流程      *      * 1.在方法开始之前      *         ①.获取Session      *         ②.把Session 和当前线程绑定,这样

org.hibernate.HibernateException: No Session found for current thread

严重: Servlet.service() for servlet [annomvc] in context with path [/joyen-learning] threw exception [Request processing failed; nested exception is org.hibernate.HibernateException: No Session found for current thread] with root causeorg.hibernate.Hib

SpringMVC4+Hibernate4运行报错Could not obtain transaction-synchronized Session for current thread

查了一下相关资料,整理如下: 原因:Hibernate4 No Session found for current thread原因 解决方法: 1.  在spring 配置文件中加入  程序代码 <tx:annotation-driven transaction-manager="transactionManager"/> 并且在处理业务逻辑的类上采用注解  程序代码 @Service public class CustomerServiceImpl implements

Hibernate4中使用getCurrentSession报Could not obtain transaction-synchronized Session for current thread

架个spring4+hibernate4的demo,dao层直接注入的sessionFactory,然后用getCurrentSession方法获取session,然后问题来了,直接报错: Could not obtain transaction-synchronized Session for current thread 提示无法获取当前线程的事务同步session,略微奇怪,这和事务有什么关系..然后百度一下有人说改成用openSession方法就好了,那我又百度了一下这2个方法的区别: