2011-12-08 18 views
18

Actualmente estoy teniendo un problema para entender un concepto de JPA.Application vs Container Managed EntityManager

Actualmente estoy usando/desarrollando una base de datos reciente de EclipseLink, Glassfish, Derby para demostrar un proyecto.

Antes de desarrollar algo en una imagen mucho más grande, tengo que estar absolutamente seguro de cómo funciona esta PersistingUnit en términos de diferentes ámbitos.

Tengo un montón de servlets 3.0 y actualmente guardo las clases de entidades asociadas al usuario en el objeto request.session (todo en el mismo archivo war). Actualmente estoy usando EntityManager administrado por aplicación utilizando EntityManagerFactory y la inyección UserTransaction. Funciona sin problemas cuando lo pruebo solo. Las diferentes versiones de las entidades ocurren cuando 2 personas acceden a las mismas entidades al mismo tiempo. Quiero trabajar con beans administrados para cruzar el mismo WAR, la misma unidad de persistencia si es posible.

He leído http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html y un montón de explicaciones de esos ámbitos que no tienen ningún sentido para mí.

Cuenta larga corta, ¿cuál es el uso y la diferencia de EntityManagers gestionados por la aplicación y el contenedor?

Respuesta

17

Cuando dice que la transacción administrada por la aplicación significa que es el código que se supone que maneja la transacción. En pocas palabras esto significa:

llame:

entityManager.getTransaction().begin(); //to start a transaction 

continuación, si el éxito que se asegurará de que llamar

entityManager.getTranasaction().commit(); //to commit changes to database 

o en caso de fallo se asegurará de que llaman:

entityManager.getTransaction().rollBack(); 

Ahora imagine que tiene un contenedor, que sabe cuándo llamar al begin(), commit() o rollback(), esa transacción administrada por contenedor. Alguien que se ocupa de la transacción en su nombre.

Solo tiene que especificar eso.

+0

¿qué quiere decir con "Ahora imagine que tiene un contenedor, quién sabe cuándo llamar a ser, confirmar o deshacer, esa transacción gestionada en contenedor. Alguien que se ocupa de la transacción en su nombre"? –

+0

El contenedor es como Spring, donde configura su bean, especifica cuál es su entidad de tansacción, como usted configura un bean de entidad, especifica que su bean como @Transactional y su transacción es atendida por Spring – mprabhat

+3

He encontrado la pregunta que refleja qué Estaba buscando - "uso y diferencia de EntityManagers gestionados por la aplicación y el contenedor", solo para descubrir que la respuesta aceptada habla de algo diferente: contenedor vs aplicación manejada _transacciones_. Además de eso, la respuesta comienza con "Cuando dices transacción gestionada por la aplicación", que OP no dijo. – alterfox

11

La transacción gestionada de contenedor (CMT) podría considerarse como un tipo de transacción declarativa, en cuyo caso, la gestión de transacción se delega en contenedor (normalmente contenedor EJB) y se podría simplificar mucho trabajo de desarrollo.

Si estamos en un entorno Java EE con un contenedor EJB, podríamos usar CMT directamente.

Si estamos en un entorno Java SE o en un entorno Java EE sin contenedor EJB, aún podríamos aprovechar CMT, una forma es utilizar Spring, que utiliza AOP para implementar la gestión declarativa de transacciones; Otra forma es usar Guice, que usa un PersistFilter para implementar una transacción declarativa.

En CMT, un contenedor (cualquiera que sea un contenedor EJB, Spring o Guice) se encargará de la propagación de la transacción y del compromiso/restitución;

La transacción administrada por aplicaciones (AMT) difiere de CMT en que necesitamos manejar las transacciones mediante programación en nuestro código.

+4

Buena respuesta, pero no olvide que cada entorno oficial Java EE siempre tiene un contenedor EJB. De lo contrario, no se puede llamar Java EE (Tomcat no es, por lo tanto, un entorno oficial Java EE). Además, en Java EE lo contrario de CMT se llama BMT; Transacciones Administradas de Bean. –

+0

Muchas gracias por su complemento a esta respuesta. – aqingsao