【问题标题】:OpenJPA - Transaction management is not available... (Fuse ESB)OpenJPA - 事务管理不可用...(Fuse ESB)
【发布时间】: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),但主要是在我的代码对象中 ab 需要在事务中持久化(全部或全部)。

我在 Fuse ESB(camel、cxf 等)中运行。

感谢任何提示或帮助。

【问题讨论】:

    标签: java jpa openjpa jta fuseesb


    【解决方案1】:

    好的,答案就在这里。

    首先,JPA ConceptsAries 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() 都会导致异常,因为我指定了&lt;jpa:context&gt;

    正确的做法是使用&lt;jpa:unit&gt;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);
    

    并且应该在蓝图中使用&lt;jpa:context&gt;EntityManager 进行配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 2013-03-06
      相关资源
      最近更新 更多