OpenJPA - 交易管理不可用......(Fuse ESB)

时间:2013-07-05 10:52:49

标签: java jpa openjpa jta fuseesb

我在Fuse ESB中使用RESOURCE_LOCAL 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();

例外,在我的persistence.xml中使用事务类型RESOURCE_LOCAL

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

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

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

我正在使用Fuse ESB(camel,cxf等)。

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

1 个答案:

答案 0 :(得分:2)

好的,这是答案。

首先,JPA ConceptsAries JPA Container

上有2个不错的链接

<强> RESOURCE_LOCAL

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

EntityManager entityManager = entityManagerFactory.createEntityManager();

...

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

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

正确的方法是使用<jpa:unit>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配置蓝图。