2011-12-22 2 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 как это может быть вызвано и из контроллера.

И мой менеджер транзакций выглядит следующим образом:

<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: ERROR [HTTP-8181-1] (.support.TransactionSynchronizationUtils: 87) - TransactionSynchronization.beforeCompletion бросил исключение java.lang.IllegalStateException: Нет значения для ключа [org.hib [email protected]] связан нить [HTTP-8181-1] на org.springframework.transaction.support.TransactionSynchronizationManager.unbindResource (TransactionSynchronizationManager.java:190) в org.springframework.orm.hibernate3.SpringSessionSynchronization .beforeCompletion (SpringSessionSynchronization.java:187) на org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCompletion (TransactionSynchronizationUtils.java:84) на org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCompletion (AbstractPlatformTransactionManager.java:895) на org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit (AbstractPlatformTransactionManager.java:693) на org.spri ngframework.transaction.support.AbstractPlatformTransactionManager.commit (AbstractPlatformTransactionManager.java:678) на 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 (Неизвестный источник)

ответ

0

Я не вижу ничего плохого в этом коде. Одна вещь, которую вы могли бы попробовать, - обходной путь: извлеките код метода2 другому методу, скажем, метод3 без @Transactional и назовите его как из метода method2, так и метода1, который остается @Transactional.

A вопрос: метод 1 и метод2 в том же классе? Если они и прокси-серверы JDK используются, то @Transactional вокруг метода2 будет игнорироваться при вызове метода method1.

Смежные вопросы