У мене є запити, як показано нижче:
- У чому різниця цих двох?
- Чи всі ці бази підтримуються обома?
- Чи відрізняються JPA TransactionManager та JTA TransactionManager?
Відповіді:
Реалізації JPA мають можливість самостійно керувати транзакціями ( RESOURCE_LOCAL
) або керувати ними за допомогою реалізації JTA сервера додатків.
У більшості випадків RESOURCE_LOCAL добре. Це використовувало б базові транзакції на рівні JDBC. Недоліком є те, що транзакція є локальною для одиниці збереження JPA, тому, якщо вам потрібна транзакція, яка охоплює кілька одиниць постійності (або інші бази даних), тоді RESOURCE_LOCAL може бути недостатньо хорошим.
JTA також використовується для управління транзакціями в таких системах, як JMS та JCA, але це досить екзотичне використання для більшості з нас.
Щоб використовувати JTA, вам потрібна підтримка на вашому сервері додатків, а також підтримка драйвера JDBC.
Як доповнення до інших відповідей
Ось уривок з надзвичайно корисної статті (опублікованої на веб-сайті Apache TomEE ), яка також може допомогти відповісти на перше запитання OP (посилання на статтю знаходиться нижче).
Порівняння контекстів збереження RESOURCE_LOCAL та JTA
З <persistence- unitaction -type = "RESOURCE_LOCAL"> ВИ відповідаєте за створення та відстеження EntityManager (PersistenceContext / Cache) ...
- Ви повинні використовувати EntityManagerFactory, щоб отримати EntityManager
- Отриманим екземпляром EntityManager є PersistenceContext / Cache
- EntityManagerFactory може бути введений через @PersistenceUnit анотацію тільки (НЕ @PersistenceContext)
- Вам не дозволено використовувати @PersistenceContext для посилання на одиницю типу RESOURCE_LOCAL
- Ви повинні використовувати EntityTransaction API, щоб починати / фіксувати кожен виклик вашого EntityManger
- Виклик entityManagerFactory.createEntityManager () двічі призводить до двох окремих екземплярів EntityManager і, отже, до двох окремих PersistenceContexts / Caches.
- Це не є майже ніколи не є хорошою ідеєю , щоб мати більше одного примірника як EntityManager у використанні (не створюйте другий , якщо ви не знищили перший)
З <живучість блоку транзакцій типу = «ССТ»> КОНТЕЙНЕР робитиме EntityManager (PersistenceContext / Cache) створення та відстеження ...
- Ви не можете використовувати EntityManagerFactory, щоб отримати EntityManager
- Ви можете отримати лише EntityManager, наданий контейнером
- EntityManager може бути введений через @PersistenceContext анотацію тільки (НЕ @PersistenceUnit)
- Вам не дозволено використовувати @PersistenceUnit для посилання на одиницю типу JTA
- EntityManager задається контейнером є посиланням на PersistenceContext / кешування , пов'язане з JTA транзакцією.
- Якщо жодна транзакція JTA не виконується, EntityManager не можна використовувати, оскільки немає PersistenceContext / Cache.
- Кожен, хто має посилання EntityManager на один і той же блок в одній транзакції , автоматично матиме посилання на один і той же PersistenceContext / Cache
- PersistenceContext / Кеш почервонів і очищається при JTA фіксації часу
Усім, хто зацікавлений у вивченні API стійкості Java - будь ласка, зробіть собі послугу та прочитайте повну статтю тут: Концепції 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 тощо.