Термины "jta-datasource" и "resouce-local datasource" для меня немного расплывчаты.
Полагаю, вы действительно ссылаетесь на jta-datasource
и non-jta-datasource
элементы.Вкратце:
- , если тип транзакции единицы постоянства равен JTA , элемент
jta-datasource
используется для объявления имени JNDI источника данных JTA, который будет использоватьсяполучить соединения.Это общий случай. - , если тип транзакции единицы персистентности resource-local ,
non-jta-data-source
следует использовать для объявления имени JNDI не-JTA источника данных.
- Эта же база данных может называться источником данных jta или локальным источником данных ресурса
Это правильно.И я не упомянул об этом чуть выше, но некоторые провайдеры даже позволяют объявлять и jta-datasource
и a non-jta-datasource
и использовать последнее для оптимизированного чтения через соединения не-JTA (то есть это не будетбыть связанным с текущей транзакцией JTA).
- Если упомянуто как источник данных jta, то бины / другие классы могут использовать JTA.Следовательно, интерфейс UserTransaction.
Первая часть верна, последняя часть не совсем.Из спецификации EJB 3.0, раздел 13.3.4. Корпоративные компоненты, использующие демаркацию транзакций, управляемых контейнером :
Бизнес-методы корпоративного компонента [...] не должны пытаться получить илииспользуйте интерфейс javax.transaction.UserTransaction
.
И раздел 16.12 Интерфейс UserTransaction :
Контейнер не должен делать интерфейс UserTransaction
доступным длякорпоративные бины, которым не разрешено использовать этот интерфейс.
Другими словами, интерфейс UserTransaction
недоступен для корпоративных компонентов CMT.
- Невозможно использовать CMT / BMT, если источником данных является ресурс локальный
Формулировка здесь немного сбивает с толку, но я бы сказал, что это не совсем правильно.Из спецификации JPA 1.0, раздел § 5.5. Управление транзакциями :
Управляемый приложением менеджер сущностей может быть либо администратором сущностей JTA, либо менеджером сущностей локального ресурса.
...
В веб-контейнерах Java EE и EJB-контейнерах должны поддерживаться как менеджеры сущностей JTA, так и менеджеры локальных ресурсов.В среде EJB обычно используется менеджер сущностей JTA.
И , раздел 6.2.1.2 тип транзакции
Атрибут transaction-type
используется для указания того, должны ли менеджеры сущностей, предоставляемые фабрикой менеджеров сущностей для модуля персистентности, быть менеджерами сущностей JTA или локальными менеджерами сущностей ресурсов.Значение этого элемента JTA
или RESOURCE_LOCAL
.Тип транзакции JTA предполагает, что будет предоставлен источник данных JTA - либо, как указано в элементе jta-data-source
, так и в контейнере.Как правило, в средах Java EE transaction-type
из RESOURCE_LOCAL
предполагает, что будет предоставлен источник данных, отличный от JTA.В среде Java EE, если этот элемент не указан, по умолчанию используется JTA.
Таким образом, вы МОЖЕТЕ использовать менеджер управляемых сущностей приложений , который может быть локально-ресурсным менеджером сущностей (вы должны ввести EntityManagerFactory
, чтобы получитьEM от этого в этом случае), и это не будет частью транзакции JTA.См. это (очень интересное) обсуждение .
- Если упомянуто как источник локального источника данных, транзакции не поддерживаются JTA.Код может использовать интерфейс EntityTransaction, но не интерфейс UserTransaction
Опять же, формулировка немного сбивает с толку, но я бы сказал, что это правильно.