Obtener la conexión a base de datos a través de Hibernate 4

Si estáis trabajando en una aplicación en la que la persistencia se hace a través de Hibernate 4, os habréis dado cuenta que ha desaparecido la posibilidad de obtener el objecto Connection a través de la Session de Hibernate. Esto sucede porque en el paso de Hibernate 3 a Hibernate 4 ha desaparecido el método connection() a través del que se podía obtener.

El problema viene en el momento en que se necesita acceder directamente a la conexión para, por ejemplo, utilizar librerías como Jasperreports que necesitan de ella para rellenar los datos del reporte cuando la fuente es la base de datos directamente. Con Hibernate 3 se hubiera podido acceder a ella directamente desde la Session, aunque en la versión 3.5 esta forma de obtenerla ya se encontraba deprecada, pero en Hibernate 4 es necesario utilizar la nueva API Work de la siguiente manera:

import javax.persistence.EntityManager;
import org.hibernate.Session;
import org.hibernate.ejb.HibernateEntityManager;
import org.hibernate.jdbc.Work;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
 
// ...
 
try{            
    // Obtenemos el entityManager de JPA. En este caso viene inyectado
    HibernateEntityManager em = (HibernateEntityManager)entityManagerProvider.get();
    Session session = em.getSession();
    session.doWork(new Work() 
    {
        @Override
        public void execute(Connection connection) throws SQLException 
        {
            try{
                InputStream fileStream = getClass().getResourceAsStream(reportPath);
                JasperReport compiledReport = JasperCompileManager.compileReport(fileStream);
                JasperPrint jasperPrint = JasperFillManager.fillReport(compiledReport, reportParameters, connection);
                
                // Visualizar o guardar el informe resultante
            }
            catch(JRException e){
                throw new RuntimeException(e);
            }
        }
    });                                                
}
catch(Exception e){            
    // Tratar el error
}

 

Deja una respuesta