Soluciones a errores adaptando una aplicación hecha con Hibernate a Oracle

Hace poco nos han pedido que adaptemos una aplicación que ya funcionaba con  MySql y SQL Server para que se pueda usar con Oracle. Estos son algunos de los problemas que hemos tenido y cómo los hemos resuelto:

No se encontraba la clase dialect

Estas clases convierten las consultas en el formato de Hibernate a SQL. Cuando la cambiamos Java lanzaba la excepción ClassNotFoundException y pensamos que era porque estaba el nombre mal escrito o no estaba en la ruta indicada. Sin embargo, las dos cosas estaban bien, lo que fallaba era que escribimos la configuración en un fichero de properties para que sea más fácil cambiarla y había un espacio en blanco al final de la línea.

ORA-01882: timezone region not found

Indica que hay que definir la zona horaria. Para programar lo cambiamos en Eclipse en Run configurations → Arguments → VM  añadiendo  “-Duser.timezone=”Europe/Madrid y después lo cambiamos en Tomcat así.

ORA-12514, TNS:listener does not currently know of service requested in connect descriptor

Significa que es incorrecto el SID, que es la palabra que se indica después del puerto en la url de conexión.

ORA-00942: table or view does not exist

El mensaje es bastante claro, y es que ha intentado hacer una consulta sobre una tabla que no existe porque no no ha sido creada durante el despliegue. Estas son algunas de las posibles causas:

  • El nombre de la tabla coincide con el de alguna del sistema como SYS_USER.
  • El nombre de una columna es una de las palabras reservadas de Oracle como password o year.

Hibernate no lanza excepciones si no puede crear una tabla durante el despliegue, por lo que para averiguar por qué ha fallado:

  1. Cambiar la property hibernate.show_sql  a  true  para que muestre las queries que ejecuta
  2. Cambiar la property hibernate.hbm2ddl.auto  a  create  para que vuelva a crear las tablas
  3. Desplegar otra vez y buscar la consulta relacionada con la tabla que falta
  4. Ejecutarla en un programa como Toad o SQL Developer

ORA-00928: missing SELECT keyword

Una consulta contiene el nombre de una columna que coincide con una de las palabras reservadas, por lo que no sabe interpretarla.

ORA-01747: invalid user.table.column, table.column, or column specification

Otro problema reacionado con un nombre de columna que coincide con una palabra reservada.

Error definiendo campos booleanos

Antes definíamos los booleanos así para que sólo pudieran tener los valores 0 o 1 y fuera obligatorio rellenarlos:

@Column(name = C_COLUMN_NAME, columnDefinition = "BIT", nullable = false)
private Boolean fieldName;

pero Hibernate no permite definir columnas como bits, por lo que cambiamos el tipo a tiny int:

@Column(name = C_COLUMN_NAME, columnDefinition = "TINYINT(1)", nullable = false)
private Boolean fieldName;

Las consultas con parámetros no devolvían los resultados esperados

La apicación también accede a otra base de datos usando prepared statements (sin Hibernate) y gracias a los tests vimos que algunos no devolvían resultados. Esto era porque algunas columnas no estaban definidas como varchar, puedes ver más información aquí.

Como veis puede haber muchos errores migrando una base de datos pese a que Hibernate lo hace bastante bien. Os animo a que comentéis otros errores que hayáis tenido.

Y como siempre, podéis dejar vuestras dudas y comentarios, y suscribiros para obtener nuevos posts por email:[mc4wp_form]

Rafael Borrego

Ingeniero informático especializado en startups y en ayudarles a crecer

Facebook Twitter LinkedIn 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>