我想知道如何使用Java EE5进行两阶段提交事务...我正在使用带JPA的EJB,其中hibernate配置了MySql。我只想使用JAVA EE规范来处理不使用hibernate或JDBC特定对象的事务....
答案 0 :(得分:4)
要确保JTA事务用于执行JPA中的所有事务工作,您需要做的就是指定Persistence Unit类型是JTA,并指定JTA数据源供JPA提供程序使用。您的persistence.xml文件将具有类似于以下内容:
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<!-- Specifies the type of the entity managers used by the persistence unit,
as a JTA entity manager -->
<persistence-unit name="example-pu" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- Specifies a JTA datasource for use by the JPA provider.
All connections obtained by the JPA provider for this persistence unit
will be from this datasource -->
<jta-data-source>jdbc/myDS</jta-data-source>
...
</persistence-unit>
</persistence>
此外,您必须确保jta-data-source
属性中定义的数据源不使用允许本地事务的优化。换句话说,涉及所述数据源的所有事务必须是XA事务,或者数据源必须是XA数据源,而不支持本地事务。
请注意,仅指定JTA数据源是不够的。您必须将持久性单元定义为需要使用JTA实体管理器的持久性单元,因为transaction-type
属性的未定义值取决于JPA提供程序运行的环境。如果提供程序在Java EE环境中运行,则将创建JTA
实体管理器,而在Java SE环境中将创建RESOURCE_LOCAL
实体管理器。
另请注意,如果您将transaction-type
指定为RESOURCE_LOCAL
,那么在Java EE环境中,JPA提供程序将忽略jta-data-source
值,而是依赖于non-jta-data-source
用于创建连接的{{1}}值。