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