2013-07-05 78 views
3

我在熔絲ESB中爲JPA的RESOURCE_LOCAL交易類型遇到問題。OpenJPA - 交易管理不可用...(Fuse ESB)

我也沒有完全瞭解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:

<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. 

我也嘗試在我的persistence.xml中使用事務類型JTA,但後來我收到OptimisticLockException

我不確定哪種方法更好(RESOURCE_LOCAL或JTA),但主要是我的代碼對象ab需要在事務中保存(全部或全部)。

我在Fuse ESB(駱駝,cxf等)中運行。

感謝您的任何提示或幫助。

回答

2

好的,這是答案。

首先,2 JPA Concepts和漂亮的鏈接​​

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