@Transaction问题:TransactionSynchronization.beforeCompletion抛出异常

时间:2011-12-22 13:26:27

标签: hibernate spring model-view-controller

我遇到一个问题,我有一个方法在服务层中调用另一个方法,如下所示:

@Transactional
    @Override
    public void method1(List<String> vals)
    {
        for (String value : vals){
            method2(value);
        }
    }

@Transactional(propagation= Propagation.REQUIRED)
public void method2(String value)
{
    //Hibernate Call 1

    //Hibernate Call 2

}

我已将Transactional注释放在方法2中,因为它也可以从Controller调用。

我的交易经理看起来像这样:

<tx:annotation-driven transaction-manager="transactionManager"/>
<aop:aspectj-autoproxy/>

<!-- Transaction manager for hibernate -->

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    <property name="dataSource" ref="dataSource"></property>

</bean>

当我在控制器调用方法1时运行此代码时,它会发出以下错误:

  

12/22/11 18:4455410:错误[http-8181-1]   (.support.TransactionSynchronizationUtils:87) -   TransactionSynchronization.beforeCompletion抛出异常   java.lang.IllegalStateException:没有key的值   [org.hibernate.impl.SessionFactoryImpl@1b2668f]绑定到线程   [HTTP-8181-1]           at org.springframework.transaction.support.TransactionSynchronizationManager.unbindResource(TransactionSynchronizationManager.java:190)           在org.springframework.orm.hibernate3.SpringSessionSynchronization.beforeCompletion(SpringSessionSynchronization.java:187)           at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCompletion(TransactionSynchronizationUtils.java:84)           at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCompletion(AbstractPlatformTransactionManager.java:895)           在org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:693)           在org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678)           at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)           在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)           在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)           在org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)           在$ Proxy31.method1(未知来源)

1 个答案:

答案 0 :(得分:0)

我真的看不出这个代码有什么问题。您可以尝试的一件事是解决方法:将method2代码提取到另一个方法,比如说没有@Transactional的method3,并从方法2和方法1中调用它,并保留@Transactional

一个侧面问题:同一个类中的method1和method2是什么?如果它们和JDK代理一起使用,那么当从method1调用时,将忽略方法2周围的@Transactional