Ошибка диспетчера транзакций Spring: транзакция MARKED_FOR_JOINED после вызова isOpen()

Что означает следующее сообщение об ошибке? Поиск в Google MARKED_FOR_JOINED не дает никакой полезной информации.

ERROR org.hibernate.AssertionFailure.<init>(AssertionFailure.java:47): an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
org.hibernate.AssertionFailure: Transaction MARKED_FOR_JOINED after isOpen() call
    at org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:465)
    at org.hibernate.ejb.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:82)
    at org.hibernate.ejb.EntityManagerImpl.<init>(EntityManagerImpl.java:61)
    at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:39)
    at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:434)
    at $Proxy30.createEntityManager(Unknown Source)
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.doGetTransactionalEntityManager(EntityManagerFactoryUtils.java:195)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:175)
    at $Proxy31.createNativeQuery(Unknown Source)
    at com.ipass.rbac.svc.FooTst.insertFoo(FooTst.java:20)
    at com.ipass.rbac.svc.FooTst$$FastClassByCGLIB$$7c736518.invoke(<generated>)
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
    at com.ipass.rbac.svc.FooTst$$EnhancerByCGLIB$$da856476.insertFoo(<generated>)
    at com.ipass.rbac.svc.SingleTst.testFoo(SingleTst.java:78)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160)
    at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:233)
    at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333)
    at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
    at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
    at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

Сообщение об ошибке появляется, когда я делаю следующее:

@Transactional
public void insertFoo() {
    em.createNativeQuery("INSERT INTO Foo (id) VALUES (:id)")
        .setParameter("id", System.currentTimeMillis() % Integer.MAX_VALUE )
        .executeUpdate();
}

Я использую spring с спящим режимом в качестве провайдера jpa. Я пытаюсь выполнить простую транзакцию, используя пул соединений Bitronix и менеджер транзакций. Точно такая же ошибка возникает, когда я переключаюсь с менеджера транзакций Bitronix на менеджер транзакций Atomikos. Ошибка не возникает при использовании jotm. Но тогда jotm, кажется, вообще ничего не делает для меня, когда дело доходит до реальных транзакций.

Вот конфигурация менеджера транзакций Bitronix:

<bean id="btmConfig" factory-method="getConfiguration"
    class="bitronix.tm.TransactionManagerServices">
    <property name="serverId" value="spring-btm" />
    <property name="journal" value="null" />
</bean>
<bean id="btmManager" factory-method="getTransactionManager"
    class="bitronix.tm.TransactionManagerServices" depends-on="btmConfig"
    destroy-method="shutdown" />
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager" ref="btmManager" />
    <property name="userTransaction" ref="btmManager" />
    <property name="allowCustomIsolationLevels" value="true" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

person HappyEngineer    schedule 30.12.2009    source источник
comment
Это второй поиск в Google, и он кажется мне полезным: forum.springsource.org /showthread.php?t=61273   -  person skaffman    schedule 31.12.2009
comment
Кстати, почему JTATransactionManager? Вам это действительно нужно?   -  person Bozho    schedule 31.12.2009
comment
@skaffman, проблема с этой веткой заключалась в том, что решение касалось enhydra xapool, что не годится. Это ужасный бассейн, который доставил нам множество проблем. Это также мертвый проект (не обновлялся годами). Однако в конце концов я понял (я думаю), что это было вызвано неправильным значением свойства hibernate.transaction.manager_lookup_class в объявлении фабрики диспетчера сущностей в контексте приложения. Я опубликую все решение, которое я придумал, как только оно заработает.   -  person HappyEngineer    schedule 01.01.2010


Ответы (1)


Эта проблема была вызвана тем, что я использовал enhydra xapool в качестве пула соединений. В конце концов, у меня все заработало, используя вместо этого пул Bitronix. См. Spring транзакционный cpool. Какой из них мне использовать? для получения полных инструкций о том, как я это сделал.

person HappyEngineer    schedule 04.01.2010