Primera SCBCD del día: Extended Persistence Context

(Imagen: Henri Matisse - Cortina Amarilla)

Which component can use a conteainer-manager entity manager with an extended persistence context?

  • any EJB component
  • only stateful session beans
  • only stateless session beans
  • session beans and web components

Los contextos de persistencia extendidos poseen un comportamiento transaccional especial. En ellos, uno puede invocar operaciones del EntityManager como persist(), merge() y remove() sin estar en una transacción. Estos inserts, updates y deletes son puestos en espera hasta que el contexto de persistencia extendido se encuentre en una transacción activa y esta sea confirmada (commited). En otras palabras, la base de datos no es tocada hasta que el contexto de persistencia pertenezca a una transacción. También, los queries ejecutados no mantienen su conexión a base de datos después de completados.

Un contexto de persistencia manejado por el contenedor (como el de la pregunta) sólo puede ser iniciado por un stateful session bean (entonces, la segunda es nuestra respuesta). Dicho contexto existe desde el momento en el que se crea un stateful session bean que declara una dependencia en un Entity Manager del tipo PersistenceContextType.EXTENDED. Dicho contexto de persistencia es cerrado por el contenedor cuando se ejecuta el método @Remove del Stateful session bean, o cuando dicha instancia es eliminada.

Un EntityManager que usa un contexto de persistencia extendido mantiene el mismo contexto de persistencia por todo su ciclo de vida. Sin importar que esté en una transacción o no, todas las entidades devueltas por el EntityManager son administradas (managed).


Pregunta tomada de ExamWorx

1 comments:

Que tal, muy buen blog, tengo una duda, lo siguiente es lo mismo?

a)
@PersistenceUnit(unitName="testDerbyDracof")
private EntityManagerFactory entityManagerFactory;
private EntityManager entityManager;
...
entityManager = entityManagerFactory.createEntityManager();

b)
@PersistenceContext(unitName="testDerbyDracof")
private EntityManager entityManager;

Saludos.

Reply

Publicar un comentario