3

RESOURCE_LOCAL在 Fuse ESB 中的 JPA 事务类型方面遇到问题。

我也没有完全了解是否JTARESOURCE_LOCAL我更好。

我的 persistence.xml :

<persistence-unit name="invoicePersistence" transaction-type="RESOURCE_LOCAL">

    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/invDataSource)</jta-data-source>
    <non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/invDataSource)</non-jta-data-source>
    <class>com.company.service.Invoice</class>
    <!-- etc... -->

</persistence-unit>

我在 blueprint.xml 中的 bean:

<reference id="invDataSource" interface="javax.sql.DataSource" filter="(datasource.name=invDataSource)"/>

<bean id="invoiceDao" class="com.company.project.InvoiceDao">
    <jpa:context unitname="invoicePersistence" property="entityManager"/>
    <tx:transaction method="*" value="Required" />
</bean>

我的代码:

    entityManager.getTransaction().begin();

    entityManager.persist(a);
    entityManager.persist(b);

    entityManager.getTransaction().commit();

RESOURCE_LOCAL还有一个例外,在我的 persistence.xml 中使用事务类型:

java.lang.IllegalStateException: Transaction management is not available for container managed EntityManagers.

我也尝试JTA在我的 persistence.xml 中使用事务类型,但后来我收到了OptimisticLockException.

我不确定哪种方法更好(RESOURCE_LOCAL 或 JTA),但主要是在我的代码对象中a并且b需要在事务中持久化(全部或全部)。

我在 Fuse ESB(camel、cxf 等)中运行。

感谢您提供任何提示或帮助。

4

1 回答 1

2

好的,这就是答案。

首先,关于JPA 概念Aries JPA 容器的 2 个不错的链接

资源_本地

transaction-type="RESOURCE_LOCAL"确实是自我管理的持久化,代码应该是这样的:

EntityManager entityManager = entityManagerFactory.createEntityManager();

...

entityManager.getTransaction().begin();
entityManager.persist(a);
entityManager.persist(b);
entityManager.getTransaction().commit();

使用entityManager.getTransaction()andentityManager.flush()都导致异常,因为我已经指定了<jpa:context>.

正确的方法是使用<jpa:unit>and EntityManagerFactory

<bean id="invoiceDao" class="com.company.project.InvoiceDao">
    <jpa:unit unitname="invoicePersistence" property="entityManagerFactory"/>
</bean>

JTA

另一方面transaction-type="JTA"是“容器管理”的持久性:

entityManager.persist(a);
entityManager.persist(b);

它应该在蓝图中配置,<jpa:context>并带有EntityManager.

于 2013-08-08T08:53:22.207 回答