У меня есть вопросы, указанные ниже:
- В чем разница между этими двумя?
- Оба ли они поддерживаются всеми базами данных?
- Отличаются ли JPA TransactionManager и JTA TransactionManager?
Ответы:
Реализации JPA имеют выбор: управлять транзакциями сами ( RESOURCE_LOCAL
) или управлять ими с помощью реализации JTA сервера приложений.
В большинстве случаев RESOURCE_LOCAL подходит. Это будет использовать базовые транзакции уровня JDBC. Обратной стороной является то, что транзакция является локальной для блока сохраняемости JPA, поэтому, если вы хотите, чтобы транзакция охватывала несколько блоков сохраняемости (или другие базы данных), то RESOURCE_LOCAL может быть недостаточно хорошим.
JTA также используется для управления транзакциями в таких системах, как JMS и JCA, но для большинства из нас это довольно экзотическое использование.
Чтобы использовать JTA, вам нужна поддержка на вашем сервере приложений, а также поддержка со стороны драйвера JDBC.
В дополнение к другим ответам
Вот отрывок из чрезвычайно полезной статьи (опубликованной на веб- сайте Apache TomEE ), которая также может помочь ответить на первый вопрос ОП (ссылка на статью ниже).
Сравнение контекстов сохранения RESOURCE_LOCAL и JTA
С помощью <persistence-unit transaction-type = "RESOURCE_LOCAL"> ВЫ несете ответственность за создание и отслеживание EntityManager (PersistenceContext / Cache) ...
- Вы должны использовать EntityManagerFactory, чтобы получить EntityManager
- Результирующий экземпляр EntityManager - это PersistenceContext / Cache
- EntityManagerFactory может быть введен через @PersistenceUnit аннотацию только (не @PersistenceContext)
- Вам не разрешено использовать @PersistenceContext для ссылки на блок типа RESOURCE_LOCAL.
- Вы должны использовать EntityTransaction API, чтобы начинать / фиксировать каждый вызов вашего EntityManger.
- Вызов entityManagerFactory.createEntityManager () дважды приводит к появлению двух отдельных экземпляров EntityManager и, следовательно, двух отдельных PersistenceContexts / Cache.
- Это не является почти никогда не является хорошей идеей , чтобы иметь более одного экземпляра в качестве EntityManager в использовании (не создавайте второй , если вы не уничтожили первый)
С <живучесть блока транзакций типа = «ССТ»> КОНТЕЙНЕР будет делать EntityManager (PersistenceContext / Cache) создание и отслеживание ...
- Вы не можете использовать EntityManagerFactory для получения EntityManager
- Вы можете получить только EntityManager, предоставленный контейнером
- EntityManager может быть введен через @PersistenceContext аннотацию только (не @PersistenceUnit)
- Вам не разрешено использовать @PersistenceUnit для ссылки на модуль типа JTA.
- EntityManager задается контейнером является ссылкой на PersistenceContext / кэширование , связанное с JTA транзакцией.
- Если транзакция JTA не выполняется, EntityManager нельзя использовать, потому что нет PersistenceContext / Cache.
- Каждый, у кого есть ссылка EntityManager на один и тот же блок в одной транзакции , автоматически будет иметь ссылку на один и тот же PersistenceContext / Cache.
- PersistenceContext / Cache очищается и очищается во время фиксации JTA
Всем, кто заинтересован в изучении Java Persistence API, сделайте себе одолжение и прочтите полную статью здесь: Концепции JPA: JPA 101 .
transaction-type=RESOURCE_LOCAL
и @PersistenceContext
и @Transactional
управляется Spring
Resource_Local и JTA - менеджеры транзакций (методы выполнения транзакций). Это не свойство базы данных, а компонент, отвечающий за координацию транзакций. Менеджеры транзакций JPA и JTA разные. Менеджер транзакций JPA отвечает за транзакции JPA, и вы хотите использовать его, если выполняете только транзакцию JPA. Диспетчер транзакций JTA - это диспетчер транзакций общего назначения, который может задействовать в транзакции другие ресурсы, такие как очереди JMS. Обычно в контейнерах Java EE используется диспетчер транзакций JTA для EJB, объектов JPA и т. Д.