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
    评论
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 是一个错误,它表示在当前的线程中无法获取与事务同步的Session。这个错误通常发生在使用Spring框架进行事务管理的情况下。 在引用中,错误的根本原因可能是在配置文件中定义的entityManagerFactory bean出现问题。这个bean是在Spring Boot中用于创建和管理JPA实体管理器的工厂。可能有一些配置错误或依赖关系问题导致无法正确创建这个bean。 在引用中,@Transactional注解表示该类中的方法应该在事务中运行。然而,如果没有正确配置事务管理器或没有启用事务支持,就会导致无法获取与事务同步的Session。 为了解决这个问题,你可以尝试以下几个步骤: 1. 检查配置文件中的entityManagerFactory bean定义,确保它的配置正确,并且所有的依赖关系都已经正确设置。 2. 确保在应用程序中正确配置了事务管理器,并且事务管理器已经与entityManagerFactory进行了正确的关联。 3. 确保使用的数据源和数据库连接配置是正确的,并且数据库已经正确地启动和运行。 4. 检查代码中使用的注解和配置,确保@Transactional注解被正确应用,并且所有需要进行的数据库操作都在事务中进行。 如果问题仍然存在,你可以考虑查看更详细的错误日志以获取更多的信息,或者在Spring社区中咨询其他开发者以获取帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值