我在Fuse ESB中使用RESOURCE_LOCAL
JPA的事务类型时遇到问题。
我也不完全了解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等)。
感谢您的任何提示或帮助。
答案 0 :(得分:2)
好的,这是答案。
首先,JPA Concepts和Aries 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
配置蓝图。