02 abril 2012

Extraer un objeto Connexion de un EntityManager

Llevo tiempo intentando pasar toda la parte de persistencia a JPA. Además de tener que reescribir código, me encuentro con problemas. Por ejemplo, tengo código que funciona con CachedRowSet, en el cual paso una consulta a la base de datos, y el resultado se almacena en un CachedRowSet, y éste se vuelca en una pestaña de un libro de Excel.

Para poder utilizar JPA, hay que sacar la conexión de un objeto EntityManager. Tenemos nuestro objeto EntityManager, y de él se puede extraer la conexión, siempre que esté dentro de una transacción!

Por ejemplo:

String sql = "la consulta SQL";
EntityManager em = emf.createEntityManager();
//Iniciamos la transacción
em.getTransaction().begin();
//Obtenemos el objeto conexión..
Connection con = em.unwrap(java.sql.Connection.class); 
// Creamos el CachedRowSet
CachedRowSet ret = CachedRowSetFactory.getCachedRowSet();
// informamos de la consulta a ejecutar
ret.setCommand(sql);
// ejecutamos la consulta y tenemos el resultado en el CachedRowSet
ret.execute(con);
// Cerramos la transacción...
em.getTransaction().commit();

Este tipo de solución viene bien cuando hemos de hacer consultas sobre una base de datos, y el resultado no lo podemos asociar a una entidad de nuestro modelo.

Espero que a alguien le sea de utilidad!