【发布时间】:2013-07-03 10:56:35
【问题描述】:
我在使用 Fuse ESB 中 JPA 的 RESOURCE_LOCAL 事务类型时遇到问题。
我也不完全了解JTA 还是RESOURCE_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),但主要是在我的代码对象中 a 和 b 需要在事务中持久化(全部或全部)。
我在 Fuse ESB(camel、cxf 等)中运行。
感谢任何提示或帮助。
【问题讨论】:
标签: java jpa openjpa jta fuseesb