gpt4 book ai didi

java - OpenJPA - 事务管理不可用...(Fuse ESB)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:49 25 4
gpt4 key购买 nike

我在处理 Fuse ESB 中 JPA 的 RESOURCE_LOCAL 事务类型时遇到问题。

我也没有完全理解 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 中的 beans:

<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();

异常(exception),在我的 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 等)中运行。

感谢任何提示或帮助。

最佳答案

好的,这是答案。

首先,JPA Concepts 上有 2 个不错的链接和 Aries JPA Container

RESOURCE_LOCAL

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

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 .

关于java - OpenJPA - 事务管理不可用...(Fuse ESB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17487174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com