Mi primera experiencia con Hibernate Tools.

Mi objetivo era conseguir un pequeño ejemplo de cómo utilizar Hibernate Tools para la generación de código a partir de una base de datos ya modelada.

Las diferentes opciones, con las que me he ido encontrando, según sea nuestra situación pueden ser:

  1. Generar código Java directamente desde la base de datos.
  2. Generar código Java desde los ficheros *.hbm.xml que hayamos diseñado que contienen las especificaciones de todas las tablas de la base de datos (ficheros de mapeo de las tablas de base de datos a los ficheros Java).

Para aprovechar toda las facilidades que nos proporciona Hibernate Tools, el ejemplo que voy a mostrar se basa en la primera opción. Los pasos que he seguido son:

  1. Generar el modelo de datos a mano.
  2. Generar el fichero de configuración de Hibernate (hibernate.cfg.xml).
  3. Generar el fichero de ANT (buil.xml).
  4. Ejecutar ANT para que genere los ficheros *.hbm.xml y así obtener los ficheros Java equivalentes.

Fichero de configuración de Hibernate

Ejemplo de fichero de configuración de Hibernate para una base de datos Oracle 9i.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:SID_BBDD</property>
        <property name="hibernate.connection.username">USERNAME</property>
        <property name="hibernate.connection.password">PASSWORD</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</property>
    </session-factory>
</hibernate-configuration>

Fichero build.xml

Ejemplo de fichero ANT build.xml.

<?xml version="1.0" encoding="windows-1252"?>
<project name="HibernateTools" default="javaGenerator" >

    <!-- Páginas donde encontré información útil
    http://www.informit.com/guides/content.aspx?g=java&amp;seqNum=145
    http://blog.chuidiang.com/category/herramientas/hibernate/
    http://my.safaribooksonline.com/0321268199/ch02lev1sec3
    y web de adictos al trabajo...
    -->
    <property name="basedir" value="C:workspaceHibernateTools">
    <property name="libs" value="${basedir}lib">
    <property name="destination" value="${basedir}src">
    <property name="dirXml" value="${basedir}xml">

    <!-- El classpath con el driver de la base de datos, hibernate y middlegen -->
    <path id="lib.class.path">
        <pathelement location="${libs}velocity-dep-1.4.jar" >
        <fileset dir="${libs}">
            <include name="**/*.jar">
        </fileset>
    </path>
    <!-- Código para generar las clases java a partir de un archivo *.hbm.xml -->
    <taskdef name="hbm2java"
        classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"
        classpathref="lib.class.path">

    <!--
        Generate the java code for all mapping files in our source tree
        Java files: /src/java
        Xml files: /hibernate
    -->
    <target name="javaGenerator"  depends="middlegen"
            description="Generate Java source from the O/R mapping files">
        <echo message="Target javaGenerator">
        <hbm2java output="${basedir}/src">
            <fileset dir="${basedir}/hibernate">
              <!-- <include name="**/*.properties"> -->
              <include name="**/*.hbm.xml">
            </fileset>
        </hbm2java>
    </target>

    <!-- Código para generar los archivos *.hbm.xml -->
    <target name="middlegen">
        <echo message="Target middlegen">

        <!-- Se define la tarea middlegen -->
        <taskdef name="middlegen" classname="middlegen.MiddlegenTask"
        classpathref="lib.class.path" >

        <!-- parámetros para la tarea middlegen -->
        <!-- catalog es el nombre de la base de datos de
             la que queremos sacar las tablas -->
        <middlegen appname="prueba_hibernate"
                    databaseurl="jdbc:oracle:thin:@172.21.16.156:1521:artedes"
                    driver="oracle.jdbc.driver.OracleDriver"
                    username="hibernate" password="hibernate"
                    catalog="hibernate"
                    schema="hibernate" >

        <!-- Directorio de destino y paquete donde dejar los .hbm.xml -->
                <hibernate destination="${basedir}/hibernate"
                        package="java"
                        javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper" >
        </middlegen>
    </target>
</project>

Problemas que pueden surgir

  1. No se genera nada. Si no se tiene acceso a internet, los ficheros xml de hibernate puede que no se verifiquen si cumplen el formato correcto. Esto es debido a que al principio de cada fichero aparece una referencia a un fichero DTD como http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd al que la aplicación se conecta para comprobar dicho formato. Si la aplicación no consigue leer el fichero, se recomienda descargarse todos los DTD que aparecen en los ficheros xml que hibernate vaya generando y sustuir esas líneas con la ruta local donde hayamos situado los ficheros (c:...hibernate-configuration-3.0.dtd).
  2. El package de los ficheros Java generados está incorrecto. Al principio configuré el build.xml para que me configurase la entrada package de los ficheros Java automáticante dentro del package "src.java" (línea 63). Primer error, la carpeta src no es un package.
  3. No se pueden generar ficheros xml de objetos del usuario SYS de Oracle. Al principio daba por supuesto que, al configurar los parámetros de conexión con la base de datos en el fichero build.xml en el tag "middlegen", se iban a leer únicamente las tablas del usuario con el que establezco la conexión. Pero parece ser que no es así, hay que especificarlo a través del parámetro "catalog" y "schema" dentro del tag "middlegen" del build.xml.
  4. No se puede importar poque la tabla no contiene Primary Key. Parece ser que todas las tablas deben tener una primary key establecida. Algunas tablas de mi bbdd no tenían primary key y tuve que añadírsela a mano.
  5. Relaciones many-to-many. Según la documentación de Hibernate, este tipo de relaciones pueden dar problemas y hace que sea necesario tocar los ficheros de mapeo a mano. Con el ejemplo que he realizado no me ha surgido este problema pero lo comento para que se tenga en cuenta de que puede ocurrir.

Resultado de la ejecución

Buildfile: C:workspaceHibernateToolsbuild.xml
middlegen:
     [echo] Target middlegen
[middlegen] (middlegen.Middlegen                 299 ) Registering plugin simple-&gt;middlegen.Plugin
[middlegen] (middlegen.Middlegen                 299 ) Registering plugin java-&gt;middlegen.javax.JavaPlugin
[middlegen] (middlegen.Middlegen                 299 ) Registering plugin plugin-&gt;middlegen.Plugin
[middlegen] (middlegen.Middlegen                 299 ) Registering plugin bmp20-&gt;middlegen.plugins.entitybean.BMP20Plugin
[middlegen] (middlegen.Middlegen                 299 ) Registering plugin cmp30-&gt;middlegen.plugins.entitybean.CMP30Plugin
[middlegen] (middlegen.Middlegen                 299 ) Registering plugin cmp20-&gt;middlegen.plugins.entitybean.CMP20Plugin
[middlegen] (middlegen.Middlegen                 299 ) Registering plugin hibernate-&gt;middlegen.plugins.hibernate.HibernatePlugin
[middlegen] Database URL:jdbc:oracle:thin:@172.21.16.156:1521:artedes
[middlegen] No &lt;table&gt; elements specified. Reading all tables. This might take a while...
[middlegen] (middlegen.Middlegen                 339 ) Validating hibernate
[middlegen] (middlegen.Middlegen                 354 ) Invoking plugin hibernate
[middlegen] (middlegen.FileProducer              325 ) Generating C:workspaceHibernateToolshibernatejavaHbCharacvalue.hbm.xml using template from jar:file:/C:/workspace/HibernateTools/lib/lib/middlegen-hibernate-plugin-2.2-dev.jar!/middlegen/plugins/hibernate/hibernate.vm
[middlegen] (middlegen.FileProducer              325 ) Generating C:workspaceHibernateToolshibernatejavaHbCharac.hbm.xml using template from jar:file:/C:/workspace/HibernateTools/lib/lib/middlegen-hibernate-plugin-2.2-dev.jar!/middlegen/plugins/hibernate/hibernate.vm
[middlegen] (middlegen.FileProducer              325 ) Generating C:workspaceHibernateToolshibernatejavaHbDemandactivitycharac.hbm.xml using template from jar:file:/C:/workspace/HibernateTools/lib/lib/middlegen-hibernate-plugin-2.2-dev.jar!/middlegen/plugins/hibernate/hibernate.vm
[middlegen] (middlegen.FileProducer              325 ) Generating C:workspaceHibernateToolshibernatejavaHbDemand.hbm.xml using template from jar:file:/C:/workspace/HibernateTools/lib/lib/middlegen-hibernate-plugin-2.2-dev.jar!/middlegen/plugins/hibernate/hibernate.vm
[middlegen] Updated preferences in C:Documents and Settingsatos.middlegenprueba_hibernate-prefs.properties
javaGenerator:
     [echo] Target javaGenerator
 [hbm2java] Processing 4 mapping files.
 [hbm2java] (hbm2java.Generator                  96  ) Generating 4 in C:workspaceHibernateToolssrc
BUILD SUCCESSFUL
Total time: 9 seconds

Más adelante incluiré el tema de las librerías necesarias para configurar la aplicación java y describiré un poco los pasos que se realizan al ejecutarse el fichero build.xml para que se comprenda mejor qué tareas se realizan y porqué he configurado mi build.xml de esta manera.

Referencias

Referencias en las que me he apoyado para poder conseguir realizar mi aplicación de ejemplo:

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies