Ficheros de mapeo de Hibernate desde las clases

1
32175

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…)

1 Comentario

  1. Tengo una consulta… A ver si me podéis ayudar…
    Estoy aprendiendo un poco y tengo un par que al ejecutarse se conecta a una bbdd creada, si está vacía crea las tablas, y sino las respeta…
    Hasta ahí bien, pero tengo una tabla donde guardo estadísticas y para identificar al usuario tengo una foreing key que relaciona un número con el usuario… Pero al ir a borrar el usuario no me permite por la foreing key dear la tabla, si la borrow manualmente funciona correctamente.
    Ahora en hibernate ¿Como debería definir el para conseguir eso? He estado probando y me gustaría que cuando se generarán las estadísticas se escribiese el valor correspondiente, y me permita borrar el usuario. Gracias Salu2!!

Dejar respuesta

Please enter your comment!
Please enter your name here