Ficheros de mapeo de Hibernate desde las clases

Ficheros de mapeo de Hibernate desde las clases

Introducción

En tutoriales anteriores hemos visto que, usando anotaciones, podemos crear clases que mapeen las entidades de una base de datos sin necesidad de ficheros de configuración (del tipo “miEntidad.hbm.xml”).

Aunque esto es muy práctico, tiene el “inconveniente” (por ponerle pegas) de que las anotaciones sólo son válidas en entornos que empleen Java 5 o superiores… Por tanto puede darse el caso de que una aplicción que hemos diseñado con anotaciones tenga que ser migrada para adaptarla a un cliente que usa en su entorno Java 1.4 (y al que no podamos convencer para cambiar de versión de Java ;).

Esto supondría que tendríamos que eliminar del código todas las anotaciones y “picar” todo el código de los ficheros de mapeo de entidades.

En este tutorial vamos a intentar generar los ficheros de configuración de Hibernate de manera automática a partir de las clases anotadas, usando para ello las Hibernate Tools

Aspectos como la descarga e instalación de Hibernate Tools quedan fuera de este tutorial, pues hay otro (arriba tenéis el enlace) en el que se explica todo el proceso


Sí, sí, pero… ¿cómo se hace?

Una vez que hemos descargado las Hibernate Tools, tenemos dos opciones. Podemos usarlas como plugin de Eclipse o podemos usarlas mediante Ant

Como plugin de Eclipse

Una vez que tenemos las tools instaladas y la consola de configuración de Hibernate generada, vamos a usar dicha consola para hacer la magia…

Pinchamos en la flecha junto al botón adecuado de la barra de herramientas superior (el que está recuadrado)

En el desplegable que aparece, seleccionamos “Open Hibernate Code Generation Dialog”, y se nos abre la ventana siguiente:

Pulsamos el botón de “Nueva configuración”:

En la ventana que aparece (pestaña “Main”), rellenamos el nombre de la nueva configuración, la configuración de consola que vamos a usar y el directorio en el que se almacenarán los ficheros generados

En la pestaña “Exporters” marcamos la opción “Hibernate XML Mappings” y pulsamos el botón “Run”… y la magia está hecha

Abrimos uno de los ficheros generados:


Usando Ant

Ya hemos visto que, usando el plugin de Eclipse, la cosa es bastante sencilla… Ahora vamos a ver cómo se podría hacer lo mismo con Ant. Esta manera de resolver el problema nos da la ventaja de no necesitar Eclipse… un fichero BAT o un shell script podría lanzar automáticamente el proceso de creación.

Lo primero que necesitamos es un fichero ejecutable de ant, que llamaremos “build.xml”

En él, hay que definir la tarea de Ant para Hibernate Tools (hibernatetool). Además, hay que indicarle el classpath donde poder encontrar la clase que implementa la tarea. También vamos a necesitar las librerías tanto de Hibernate como de Hibernate Annotations, por lo que las pondremos ya en el classpath:

Y ahora hay que meter la llamada a la tarea Ant propiamente dicha. La tarea precisa un sistema de trazas (commons-login) y otras librerías que añadiremos al classpath (el resto de librerías necesarias las averiguamos por prueba/error; vemos lo que dice que falta y “googleamos” :-)

Otra cosa importante es que, cuando a la tarea le pasamos la ruta a las clases del proyecto, debemos pasarle la ruta a las clases compiladas

Os adjunto enlaces a las librerías:

En cualquier caso, si utilizáis Maven en vuestros proyectos, la mayoría de estas librerías las podéis encontrar en los repositorios públicos.

Ejecutamos el Ant, y…

Como vemos, los ficheros generados de ambas maneras son iguales, salvo por algún salto de línea. Ahora solo falta comprobar que los ficheros son correctos… Para ello, vamos a elminar las anotaciones de las clases (aunque no las quitemos, debería hacer caso a los ficheros antes que a las anotaciones, pero para estar seguros, las quitamos). Además de quitar las anotaciones, en el “hibernate.cfg.xml” cambiamos todas las entradas de tipo “<mapping class=”…” />” por entradas del tipo “<mapping resource=”mificherogenerado.hbm.xml” />”.


Probando los ficheros

Lo primero que vemos es que, si tenemos clases anotadas que hereden de otras, obtenemos un error al intentar ejecutar nuestro proyecto… ya que, si bien en las subclases sí que genera el atributo “discriminator-value”, en la clase base no genera la etiqueta “<discrminator column=”” type=””>”. Veamos un ejemplo.

Debería tener este otro aspecto:

Por otro lado, hay que tener en cuenta que nuestras clases tienen que tener los getters y setters para que se pueda acceder a los campos de la entidad

Otro fallo que he encontrado al generar los ficheros de mapeo automáticamente es que no convierte las anotaciones “@cascade”. Por ejemplo, el siguiente fragmento de código

Lo traduce de la siguiente manera:

Como podéis ver, la información sobre las acciones que deben ejecutarse en cascada se ha perdido… Esto causa problemas a la hora de persistir el objeto si no se persiste también explícitamente la entidad asociada (“BuycartProduct” en este caso). Lo correcto habría sido

Una vez que hemos tomado estas precauciones, empaquetamos nuestra aplicación y la desplegamos en nuestro servidor de aplicaciones (en mi caso, un Tomcat 6.0.16) y…

Conclusiones

Como podéis ver, es fácil transformar nuestro entorno de Hibernate basado en clases anotadas para usar ficheros de configuración XML, usando las Hibernate Tools… No obstante, si lo que queréis es migrar una aplicación con anotaciones a un entorno que utilice Java 1.4, recordad que no sólo hay que quitar las anotaciones, sino que hay que eliminar también la utilización de Generics (del tipo “List<String>”). Lo demás, como habéis visto, es sencillo…

Pero si a pesar de esta sencillez preferís que otros lo hagan por vosotros, os recuerdo que podéis contratar a Autentia, expertos en el desarrollo de aplicaciones usando las tecnologías más avanzadas (Spring, Hibernate, JSF, ICEFaces…)