2011-08-23 37 views
2

我想知道如何通過使用Java EE5來執行兩階段提交事務......我正在使用具有使用MySql配置的hibernate的JPA的EJB。我只想使用JAVA EE規範來處理不使用休眠或JDBC特定對象的事務....Java EE 5中的兩階段提交事務

回答

4

爲確保JTA事務用於執行JPA中的所有事務性工作,您只需指定持久單元類型是JTA,並指定供JPA提供程序使用的JTA數據源。你的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-typeRESOURCE_LOCAL,然後在Java EE環境下,JPA提供商將忽略jta-data-source值,而會依靠創建連接的non-jta-data-source值。

+0

非常感謝你的及時回覆....如果你能告訴我如何做一步一步的配置,這將是真正可觀的,因爲我是這個交易世界的新手... – user796666

+0

你是什麼意思的步驟按步驟配置?每個容器幾乎肯定會有所不同。另外,我相信通過提出一個不同的問題可以更好地服務,因爲它的主題與當前的主題不同。 –

+0

我被困在配置給了MySQL的XA數據源persistance.xml ... – user796666