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>
- 方案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