2011-12-22 5 views
2

を投げた私は、私は次のようにサービス層で別のメソッドを呼び出している一つの方法を持っている問題に直面しています:@Transaction問題:TransactionSynchronization.beforeCompletionは例外

@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 

} 

私は方法2でトランザクション注釈を入れていますコントローラからも呼び出すことができます。

そして、私のトランザクションマネージャは、次のようになります。

12/22/11:それは次のエラーを与えている1コントローラは、メソッドを呼び出しているとき、私はこのコードを実行している場合は

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

18:4455410:エラー[http-8181-1] (.support.TransactionSynchronizationUtils:87) - TransactionSynchronization.beforeCompletion例外が投げられました java.lang.IllegalStateException:キーの値がありません [org.hib [email protected]]スレッドにバインド [HTTP-8181から1 org.springframework.orm.hibernate3.SpringSessionSynchronizationで】org.springframework.transaction.support.TransactionSynchronizationManager.unbindResource(TransactionSynchronizationManager.java:190)で org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCompletionでorg.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCompletion(TransactionSynchronizationUtils.java:84) (AbstractPlatformTransactionManager.java:895)で.beforeCompletion(SpringSessionSynchronization.java:187) org.spriのorg.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:693) にあります。 org.springframework.transaction.interceptor.TransactionInterceptor.invokeでorg.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321) でngframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678) ( $ Proxy31でorg.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) でorg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) でTransactionInterceptor.java:116) .method1(不明な情報源)

答えて

0

このコードには何も間違いはありません。解決策の1つは回避策です。メソッド2のコードを別のメソッド(例えば@Transactionalなし)から抽出し、method2とmethod1の両方から呼び出す場合は、@Transactionalのままにしておきます。

サイド質問:メソッド1とメソッド2は同じクラスですか?それらが存在し、JDKプロキシが使用されている場合、method1から呼び出されたときにmethod2のまわりの@Transactionalは無視されます。

関連する問題