Все, что вам нужно сделать, чтобы убедиться, что транзакции JTA используются для выполнения всей транзакции в JPA, - это указать, что типом единицы измерения постоянства является 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
менеджеры сущностей, где как RESOURCE_LOCAL
менеджеры сущностей будут созданы в среде Java SE.
Также обратите внимание, что если вы укажетеtransaction-type
как RESOURCE_LOCAL
, затем в среде Java EE провайдер JPA игнорирует значение jta-data-source
и вместо этого будет полагаться на значение non-jta-data-source
для создания соединений.