openxava / documentación / EJB3 JPA

Tabla de contenidos

EJB3 JPA
Configurar nuestra aplicacion para que funcione con EJB3
Usando JPA en nuestro código
Usar JPA en un validador o método de retrollamada
OpenXava soporta EJB3 desde la versión 2.1.

Configurar nuestra aplicacion para que funcione con EJB3

Desde la v3.0 JPA es el gestor de pesistencia por defecto, así que no tienes que hacer nada. Pero si usas v2.1 o v2.2 y quieres usar JPA entonces has de editar el archivo properties/xava.properties de tu proyecto, y lo dejarlo así:
# EJB3 Java Persistence API
persistenceProviderClass=org.openxava.model.impl.JPAPersistenceProvider
mapFacadeAsEJB=false
A partir de ahora, tu aplicación usará EJB3 JPA en lugar de Hibernate para manejar la persistencia de los objetos.

Usando JPA en nuestro código

Podemos usar el estándar Java Persistence API en cualquier parte de una aplicación OpenXava, esto es, dentro de calculadores, acciones, filtros, etc.
Para facilitar el uso de JPA OpenXava provee la clase XPersistence. Por ejemplo, si queremos guardar un objeto en la base de datos usando JPA, la manera típica sería:
EntityManagerFactory f = Persistence.createEntityManagerFactory("default");
EntityManager manager = f.createEntityManager();
manager.getTransaction().begin();
Cliente cliente = ... ;
manager.persist(cliente);
manager.getTransaction().commit();
manager.close();
Pero, dentro de OpenXava y usando XPersistence podemos escribir:
Cliente cliente = ... ;
XPersistence.getManager().persist(cliente);
Nada más.
La primera vez que llamamos a XPersistence.getManager() un manager nuevo es creado y asignado al hilo actual y una transacción es creada también; la siguiente vez que lo llamemos, el mismo manager de JPA es usado. Al final del ciclo completo de la ejecución de la acción, OpenXava confirma automáticamente la transacción y cierra el manager.
Podemos, opcionalmente, confirmar la transacción en cualquier momento llamando a XPersistence.commit(), si después de esto llamamos a XPersistence.getManager() un nuevo manager y transacción son creados.
Podemos ver más acerca de esto consultando el API de org.openxava.jpa.XPersistence.

Usar JPA en un validador o método de retrollamada

Tanto los validares como los métodos de retrollamada se pueden ejecutar en el momento de hacer la grabación en la base de datos (flush), por tanto si usas XPersistence.getManager() desde ellos se pueden producir problemas. Si necesitas usar JPA en tu validador o método de retrollamada, tendrás que abrir un entity manager diferente usando XPersistence.createManager() (por tanto JPA no hará un flush de los cambios en curso). Usa un código como el siguiente para obtener y usar una nueva instancia de EntityManager:
EntityManager em = XPersistence.createManager();
//... usamos em
em.close(); // Has de cerrar el manager tu mismo
Ten cuidado con posibles problemas de aislamiento y bloqueo de registros cuando uses esta técnica.