Проблема с управляемой контейнером транзакцией (openJPA + Spring + WAS 8.5)

Я столкнулся с проблемой при внедрении EntityManager в DAO без использования @PersistenceContext.

Я работаю над приложением, которое имеет два EntityManagerFactories, одно из которых использует jndi источник данных и другой, который использует jdbc источник данных. Я должен внедрить EntityManager в DAO без использования @PersistenceContext, так как я хочу использовать один и тот же DAO для обоих источников данных. Оба постоянных модуля находятся в одном файле persistence.xml

Подход, который я придерживался:

PersistenceContext-jdbc.xml

<tx:annotation-driven transaction-manager="demoTransactionManager" />
<bean id="demoEntityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="beanName" value="demoEntityManager" />
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="jdbcPersistence" />
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
            <property name="showSql" value="true" />
            <property name="generateDdl" value="false" />
            <property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.DB2Dictionary" />
        </bean>
    </property>
    <property name="loadTimeWeaver">
        <bean
            class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
</bean>

<bean id="demoDAO" class="com.test.dao.DemoDAO"
    <property name="demoEntityManager">
    <bean class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
        <property name="entityManagerFactory" ref="demoEntityManagerFactory"/>  
    </bean>
    </property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    ....database properties....
</bean>

<bean id="demoTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="demoEntityManagerFactory" />
</bean>

PersistenceContext-jndi.xml

<bean id="demoEntityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="beanName" value="demoEntityManager" />
    <property name="persistenceUnitName" value="jndiPersistence" />
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
            <property name="showSql" value="true" />
            <property name="generateDdl" value="false" />
            <property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.DB2Dictionary" />
        </bean>
    </property>
</bean>

<bean id="demoDAO" class="com.test.dao.DemoDAO">
    <property name="demoEntityManager">
    <bean id="demoEntityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
        <property name="entityManagerFactory" ref="demoEntityManagerFactory"/>  
    </bean>
    </property>
</bean> 

Хотя я могу внедрить EntityManager для потока JDBC. Я сталкиваюсь с проблемами с тем же потоком jndi.

Приложение опрашивает сообщения из MQ, используя пружинную интеграцию (@ServiceActivator).

Следующее исключение, которое я получаю:

Setup of JMS message listener invoker failed for destination 'queue://<QueueName>' - trying to recover. Cause: Could not open JPA EntityManager for transaction; nested exception is <openjpa-2.2.2-r422266:1468616 nonfatal user error> org.apache.openjpa.persistence.InvalidStateException: You cannot access the EntityTransaction when using managed transactions.

0 ответов

Другие вопросы по тегам