1. 程式人生 > 其它 >解決問題 Could not obtain transaction-synchronized Session for current thread

解決問題 Could not obtain transaction-synchronized Session for current thread

解決問題 Could not obtain transaction-synchronized Session for current thread


 

問題現象

在使用Hibernate的專案中,在一個定時任務中,執行某段程式碼,滿足條件後,更新表資料。

程式在執行到更新表資料的時候,報錯如下:

Could not obtain transaction-synchronized Session for current thread

 

 

解決方案

spring-config.xml 配置事務 切入點 切入方法

    <!-- 配置事務管理 -->
    <
bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 指定使用cglib --> <aop:aspectj-autoproxy proxy-target-class="true" /> <!-- 配置事務的傳播特性
--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="dispose*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!-- 配置事務的切入點 --> <aop:config> <
aop:pointcut id="targetMethodSchedule" expression="execution(* com.miracle.luna.mock.schedule.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="targetMethodSchedule" /> </aop:config>

 

[說明]

1、<tx:method name="dispose*" propagation="REQUIRED" /> 表示對dispose 開頭的方法有效

2、<aop:pointcut id="targetMethodSchedule" expression="execution(* com.miracle.luna.mock.schedule.*.*(..))" /> 可以模糊匹配 schedule 目錄下的多個服務層

注意此處,不管schedule目錄下下有沒有細分 service 和 impl層,必須是 schedule.*.*(..)) ,否則會報如下錯誤。

Caused by: java.lang.IllegalArgumentException: warning no match for this type name: com.miracle.luna.mock.schedule [Xlint:invalidAbsoluteTypeName]
    at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:315)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:217)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:190)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:169)
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:220)
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:279)
    at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:311)
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:119)
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:89)
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:70)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:346)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:298)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:423)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1633)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    ... 149 more