2013-07-05 1 views
3

У меня возникли проблемы с RESOURCE_LOCAL тип транзакции для JPA в Fuse ESB.OpenJPA - Управление транзакциями не доступно ... (Предохранитель ESB)

У меня также нет полного понимания того, подходит ли мне 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:

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

Я также попытался использовать транзакционный тип JTA в моем persistence.xml, но затем получил OptimisticLockException.

Я не уверен, какой подход лучше (RESOURCE_LOCAL или JTA), но главное, что в моем объекте кода a и b необходимо сохранить транзакцию (все или ничего).

Я работаю в Fuse ESB (верблюд, cxf и т. Д.).

Спасибо за любые советы или помощь.

ответ

2

Хорошо, вот ответ.

Во-первых, 2 хорошие ссылки на JPA Concepts и Aries JPA Container

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() оба вызвали исключения, bec ause я указал <jpa:context>.

Правильный способ сделать это с помощью <jpa:unit> и EntityManagerFactory.

<bean id="invoiceDao" class="com.company.project.InvoiceDao"> 
    <jpa:unit unitname="invoicePersistence" property="entityManagerFactory"/> 
</bean> 

ЕТ

С другой стороны transaction-type="JTA" является 'управляемым контейнер' настойчивости:

entityManager.persist(a); 
entityManager.persist(b); 

, и он должен быть сконфигурирован в плане с <jpa:context> и EntityManager.

 Смежные вопросы

  • Нет связанных вопросов^_^