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.