sprimvc层发生Hibernate事务异常 Could not obtain transaction-synchronized Session for current thread

Caused by: org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 无法获取当前线程的事务同步会话

今天碰到一个很有趣的异常的,是我自己给自己的程序找了个bug。(我在springmvc的controller层调用dao层的方法。)

原因分析:

被扫描进springmvc层的对象是不支持事务。所以解决方案是
1.方案1: 在springmvc的配置文件中【排除需要支持事务的类】

 <!--  使用注解方式配置json转换器,使得springmvc自动进行json格式的转换 ,这里需要添加jackson-databind和jackson-annotations的jar包-->
    <mvc:annotation-driven />
   <!-- <mvc:resources mapping="/adminManagePages/**" location="/adminManagePages/"/>-->
    <context:component-scan base-package="com.bbs" >
        <context:include-filter type="annotation"
                                expression="org.springframework.stereotype.Controller" />
        <!-- 排除@service注解的类 -->
        <context:exclude-filter type="annotation"
                                expression="org.springframework.stereotype.Service" />
        <!-- 排除@Repository注解的类 -->
        <context:exclude-filter type="annotation"
                                expression="org.springframework.stereotype.Repository" />
    </context:component-scan>
  1. 方案2:利用spring的aop面向切面的功能实现事务的传播(织入)
<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="save*" propagation="REQUIRED"/>
			<tx:method name="set*" propagation="REQUIRED"/>
			<tx:method name="del*" propagation="REQUIRED"/>
			<tx:method name="update*" propagation="REQUIRED"/>
			
			<tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>			
			<tx:method name="find*" read-only="true" propagation="NOT_SUPPORTED"/>
			<tx:method name="query*" read-only="true" propagation="NOT_SUPPORTED"/>			
			<tx:method name="select*" read-only="true" propagation="NOT_SUPPORTED"/>				
					
			<tx:method name="*" rollback-for="Exception"/>
		</tx:attributes>
	</tx:advice>	
	<aop:config proxy-target-class="true">
		<aop:pointcut id="txNeed" expression="<span style="color:#FF0000;">execution(* com.watson.web.service..*.*(..))</span>"/>
        <aop:advisor pointcut-ref="txNeed" advice-ref="txAdvice"/>
	</aop:config>

红色部分为定义通知织入的横切面,也就是横切点,会扫描service包下面的(包括子包)所有类的所有方法,为扫描到的方法织入事务。

另外需要注意的点:

    <!-- 开启注解事务,用事务来实现事务管理 -->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
@Repository
@Transactional
//使用注解使其支持事务
public class UserDaoImpl extends HibernateDaoSupport {
@Resource
    public void setSessionFactory0(SessionFactory sessionFactory){
        super.setSessionFactory(sessionFactory);
    }

    public List<User> getAllUser(){

        //SQLQuery sqlQuery=this.getHibernateTemplate().getSessionFactory().getCurrentSession().createSQLQuery("select * from user");
        sqlQuery=this.getCurrentSession().createSQLQuery("select * from user");
        List<User> listUser=sqlQuery.addEntity(User.class).list();
        return listUser;
    }
}

参考文章:
https://blog.csdn.net/crazyitlhs/article/details/49426325

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值