2011-12-11 20 views
25

Recientemente comencé a trabajar con JPA en Google App Engine. Al leer algunos ejemplos, he notado un par de variaciones en la forma en que persisten los objetos. En un caso, he visto algo como esto:JPA - Cuándo utilizar getTransaction() cuando persisten objetos

entityManager.getTransaction().begin(); 
entityManager.persist(object); 
entityManager.getTransaction().commit(); 

En otros casos, no veo el uso de GetTransaction(). Simplemente veo entityManager.persist (object). ¿Cuándo es apropiado usar getTransaction()?

Respuesta

14

Si usa contenedor administrado EntityManager, entonces está usando transacciones JTA. Por lo tanto, no es necesario (más precisamente, no se puede) interferir con las transacciones EntityManager que se obtuvieron utilizando entityManager.getTransaction(). JTA inicia y confirma su transacción.

Si utiliza la aplicación administrada EntityManager y no desea formar parte de una transacción JTA, debe gestionarla usted mismo (se denomina administrador de entidad de recurso local).

Más comúnmente, la aplicación administrada EntityManager que funciona con EntityManager.getTransaction() se usa en el entorno Java SE.

EDIT: Puede que le interese la sección 7.5 Controlar las transacciones del JPA 2.0 specification.

+2

GAE no soporta JTA. –

+0

Nunca funcionó con GAE: pensó que se trataba de una cuestión más centrada en las transacciones JPA. Gracias por la aclaración. –

+1

necesitamos una transacción aun cuando obtengamos entidad de la base de datos ... usando el método entitymanager.find ... solo curiosidad ... porque no puedo ver ni un solo ejemplo ... donde con transaction.begin() before entitymanger.find método ... :) :) – goodyzain

0

Utilizará getTransaction() cuando gestione explícitamente las transacciones en su aplicación. Por otro lado, si deja que el contenedor maneje las transacciones por usted, no será necesario comenzar/finalizar transacciones explícitamente. Básicamente, se trata de la diferencia entre Container Managed Transactions (CMT) y Bean Managed Transactions (BMT).

En general, utilizará BMT cuando necesite más control sobre el procesamiento transaccional, o cuando haya requisitos técnicos adicionales (por ejemplo, confirmaciones de dos fases, transacciones distribuidas, transacciones XA) que no se puedan cumplir mediante el uso de CMT. Además, utilizaría BMT cuando sus aplicaciones se implementan fuera de un servidor de aplicaciones y depende de Java SE.

5

En GAE no hay Java EE/JTA, por lo que se ignoran términos como la transacción gestionada de bean (BMT) y las transacciones gestionadas por contenedor (CMT).

Su trabajo es transaccional (donde desea que múltiples objetos vayan al almacén de datos a la vez, o todos fallan - aquí es donde se usa getTransaction()) o no transaccional (donde todo va al almacén de datos por uno, y la falla de uno persiste no afecta a otros - aquí es donde simplemente llama a persist()/merge()/remove()).

+1

Hay algunas partes de Java EE en GAE, simplemente no hay ningún perfil completo. JPA, por ejemplo, es una API de Java EE, pero su comportamiento es un "poco diferente". –

3

Google App Engine tiene su gestión de transacciones (https://developers.google.com/appengine/docs/java/datastore/transactions) pero la interfaz de transacción JPA no tiene conocimiento de algunas de las funcionalidades subyacentes de GAE (es decir, grupos de entidades).

Depende de su aplicación decidir qué operaciones realizar en una transacción y cuáles no. Debe colocar en una transacción las operaciones que deben ejecutarse atómicamente.

Recuerde como una práctica recomendada para realizar acciones en cascada y operaciones de relación en una transacción porque JPA podría desencadenar muchas consultas y podría dar lugar a una situación de datos incoherentes.

Ejemplo de utilización de transacción con JPA2:

import javax.persistence.EntityTransaction; 


EntityTransaction txn = em.getTransaction(); 
txn.begin(); 
try { 
    //do something with your database 
    txn.commit(); 
} 
finally { 
    if (txn.isActive()) 
     txn.rollback(); 
}