@Transaction Issue: TransactionSynchronization.beforeCompletion вызвало исключение - PullRequest
2 голосов
/ 22 декабря 2011

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

@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: ОШИБКА [http-8181-1] (.support.TransactionSynchronizationUtils: 87) - TransactionSynchronization.beforeCompletion вызвала исключение java.lang.IllegalStateException: для ключа [org.hibernate нет значения.Импл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.springframework.transaction.support.AbstractPlatformTransactionManager.commit (AbstractPlatformTransactionManager.java:678) в org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionInterceptor.java:116) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:171) в org.springframework.aop.framework.JdkDynamicAopho.jpgProxy.jp(Неизвестный Кислыйce)

1 Ответ

0 голосов
/ 23 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...