Tenho as seguintes perguntas:
- Qual é a diferença entre esses dois?
- Ambos são suportados por todos os bancos de dados?
- JPA TransactionManager e JTA TransactionManager são diferentes?
Respostas:
As implementações JPA têm a opção de gerenciar as próprias transações ( RESOURCE_LOCAL
) ou gerenciá-las pela implementação JTA do servidor de aplicativos.
Na maioria dos casos, RESOURCE_LOCAL é adequado. Isso usaria transações básicas de nível JDBC. A desvantagem é que a transação é local para a unidade de persistência JPA, portanto, se você deseja uma transação que abrange várias unidades de persistência (ou outros bancos de dados), RESOURCE_LOCAL pode não ser bom o suficiente.
JTA também é usado para gerenciar transações em sistemas como JMS e JCA, mas é um uso bastante exótico para a maioria de nós.
Para usar JTA, você precisa de suporte para ele em seu servidor de aplicativos e também de suporte do driver JDBC.
Além de outras respostas
Aqui está um trecho do artigo extremamente útil (publicado no site do Apache TomEE ), que também pode ajudar a responder à primeira pergunta do OP (o link para o artigo está abaixo).
Comparando os contextos de persistência RESOURCE_LOCAL e JTA
Com <persistence-unit transaction-type = "RESOURCE_LOCAL"> VOCÊ é responsável pela criação e rastreamento de EntityManager (PersistenceContext / Cache) ...
- Você deve usar o EntityManagerFactory para obter um EntityManager
- A instância EntityManager resultante é um PersistenceContext / Cache
- Um EntityManagerFactory pode ser injetado apenas por meio da anotação @PersistenceUnit (não por @PersistenceContext)
- Você não tem permissão para usar @PersistenceContext para se referir a uma unidade do tipo RESOURCE_LOCAL
- Você deve usar a API EntityTransaction para iniciar / confirmar cada chamada para o seu EntityManger
- Chamar entityManagerFactory.createEntityManager () duas vezes resulta em duas instâncias EntityManager separadas e, portanto, dois PersistenceContexts / Caches separados.
- É não quase uma boa idéia ter mais de uma instância de um EntityManager em uso (não criar um segundo a menos que você destruiu o primeiro)
Com <persistence-unit transaction-type = "JTA"> o CONTAINER fará EntityManager (PersistenceContext / Cache) criando e rastreando ...
- Você não pode usar o EntityManagerFactory para obter um EntityManager
- Você só pode obter um EntityManager fornecido pelo contêiner
- Um EntityManager pode ser injetado apenas por meio da anotação @PersistenceContext (não por @PersistenceUnit)
- Você não tem permissão para usar @PersistenceUnit para se referir a uma unidade do tipo JTA
- O EntityManager fornecido pelo contêiner é uma referência ao PersistenceContext / Cache associado a uma transação JTA.
- Se nenhuma transação JTA estiver em andamento, o EntityManager não pode ser usado porque não há PersistenceContext / Cache.
- Todos com uma referência EntityManager à mesma unidade na mesma transação terão automaticamente uma referência ao mesmo PersistenceContext / Cache
- O PersistenceContext / Cache é liberado e limpo no tempo de confirmação do JTA
Qualquer pessoa interessada em aprender a Java Persistence API - faça um favor a si mesmo e leia o artigo completo aqui: Conceitos de JPA: JPA 101 .
transaction-type=RESOURCE_LOCAL
e @PersistenceContext
e @Transactional
gerido pela Primavera
Resource_Local e JTA são gerenciadores de transações (métodos de fazer transações). Esta não é propriedade do banco de dados, mas o componente responsável por coordenar as transações. Os gerenciadores de transações JPA e JTA são diferentes. O gerenciador de transações JPA é responsável pelas transações JPA e você deseja usar um se estiver apenas fazendo transações JPA. O gerenciador de transações JTA é um gerenciador de transações de propósito geral e pode alistar outros recursos, como filas JMS na transação. Normalmente, os contêineres Java EE empregam um gerenciador de transações JTA para EJBs, entidades JPA, etc.
resource_local vs JTA é sobre transação local vs transação global. É sobre como podemos gerenciar vários recursos em uma única transação.
CMT vs BMT trata de quem está abrindo e fechando a transação - desenvolvedor de aplicativos ou servidor de aplicativos.