Cannot open connection ó No suitable driver found en iReport y Hibernate

iReport es una aplicación Swing que permite diseñar reportes para Jasper Reports, generando automáticamente el archivo XML con la definición de éste. Para probar el reporte que está siendo construido, iReport permite conectarse a distintos tipos de fuentes de datos, entre las que se cuenta Hibernate, de modo de alimentar con datos el informe para ver como resulta en pantalla.
El error descrito en este artículo se encuentra en dos puntos:

  • En el menú Data la opción Report Query permite ejecutar una consulta en distintos dialectos incluyendo HQL. Al escribir una consulta para Hibernate el software mostrará el Bean relacionado junto con permitir seleccionar los campos a utilizar. Sin embargo, aparece el mensaje “Error: Cannot open connection”.
  • Al compilar el reporte (por ejemplo, al ejecutarlo con datos) aparece la siguiente excepción:

Error filling print… Cannot open connection

 org.hibernate.exception.GenericJDBCException: Cannot open connection
   at org.hibernate.exception.ErrorCodeConverter
   .handledNonSpecificException(ErrorCodeConverter.java:92)  
   at org.hibernate.exception.ErrorCodeConverter
   .convert(ErrorCodeConverter.java:80)  
   at org.hibernate.exception.JDBCExceptionHelper
   .convert(JDBCExceptionHelper.java:43)  
   at org.hibernate.exception.JDBCExceptionHelper
   .convert(JDBCExceptionHelper.java:29)  
   at org.hibernate.jdbc.ConnectionManager
   .openConnection(ConnectionManager.java:301)  
   at org.hibernate.jdbc.ConnectionManager
   .getConnection(ConnectionManager.java:110)  
   at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:137)  
   at org.hibernate.transaction
   .JDBCTransaction.begin(JDBCTransaction.java:49)  
   at org.hibernate.transaction.JDBCTransactionFactory
   .beginTransaction(JDBCTransactionFactory.java:24)  
   at org.hibernate.jdbc.JDBCContext
   .beginTransaction(JDBCContext.java:271)  
   at org.hibernate.impl.SessionImpl
   .beginTransaction(SessionImpl.java:1079)  
   at it.businesslogic.ireport.IReportCompiler
   .run(IReportCompiler.java:986)      
   at java.lang.Thread.run(Unknown Source)  
Caused by: java.sql.SQLException: No suitable driver found for 
   jdbc:oracle:thin:uscado/uscado@atacama:1521:devel  
   at java.sql.DriverManager.getConnection(Unknown Source)
   at java.sql.DriverManager.getConnection(Unknown Source)  
   at org.hibernate.connection.DriverManagerConnectionProvider
   .getConnection(DriverManagerConnectionProvider.java:110)  
   at org.hibernate.jdbc.ConnectionManager
   .openConnection(ConnectionManager.java:298)
     ... 8 more

Con estos errores finalmente sólo es posible ejecutar la previsualización de los reportes sin datos, y crear los campos de los objetos a utiliza manualmente.

 

Causa

iReport tiene una falla en el manejo de su classpath. Normalmente a través de la opción de menú Options->Classpath es posible agregar JARs y carpetas completas al classpath, lo que funciona correctamente por ejemplo con el JAR de los Beans usados en las consultas.

Sin embargo el driver usado (en este caso puntual ojdbc14.jar para Oracle) no es encontrado a pesar de encontrarse explícitamente agregado al classpath.

Solución

Para obligar a iReport a encontrar el driver se debe copiar el archivo correspondiente (ojdbc14.jar) en este caso) a la carpeta de librerías de iReport. Esta corresponde a:

<Carpeta_Instalacion>/lib

por ejemplo, en Windows:

C:\Program Files\JasperSoft\iReport-2.0.4\lib