Generar los java beans con Hibernate

De ChuWiki

Introducción[editar]

Con hibernate, a partir de los ficheros de configuración .hbm.xml, podemos construir automáticamente los fuentes java correspondientes a los beans de las tablas. Es decir, por cada tabla construye una clase java cuyos atributos son las columnas de la tabla y con los métodos set() y get() correspondientes a esos atributos. Por supuesto, en el fichero .hbm.xml podemos configurar ciertas cosas, de forma que los nombres de los atributos java no se llamen igual que los nombres de las columnas.


¿Qué necesitamos?[editar]

Necesitamos los mismos jar y herramientas que necesitábamos para la Ingeniería inversa con Hibernate. Lo resumimos aquí de todas formas, pero echa un ojo al enlace para los detalles.

  • Hibernate-core, con todos sus jar.
  • Hibernate-tools o middlegen, con todos sus jars.
  • ant, ya que middlegen sólo se puede ejecutar con ant.

También necesitas tener conexión a internet. Los ficheros .hbm.xml llevan en su cabecera el fichero .dtd asociado al .hbm.xml. Hibernate intenta leer ese fichero .dtd para ver si el fichero .hbm.xml está correctamente construido, y dicho fichero .dtd se encuentra en internet, en http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd Si no tines acceso a internet, te fallará.

Aqui uno de los ficheros .html.xml que he usado para el ejemplo

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping>

	<class name="com.chuidiang.beans.Coche" table="COCHE">

		<id name="idCoche" type="java.lang.Integer" column="ID_COCHE">
			<generator class="assigned" />
		</id>

		<property name="marca" type="java.lang.String" column="MARCA"
			length="255" />
		<property name="matricula" type="java.lang.String"
			column="MATRICULA" length="255" />
		<property name="fechaMatricula" type="java.sql.Date"
			column="FECHA_MATRICULA" />
		<property name="idPropietario" type="int"
			column="ID_PROPIETARIO" not-null="true" length="10" />
		<property name="id" type="int" column="ID" not-null="true"
			length="10" />

		<!-- Associations -->


	</class>
</hibernate-mapping>

Construir un build.xml[editar]

Debemos, con nuestro editor favorito, hacer un fichero build.xml para ant, en el que le diremos dónde están todos los jar necesarios, qué debe ejecutar de middlegen y la configuración necesaria para ejecutar middlegen. El fichero build.xml puede ser como el siguiente

<project name="MyProject" default="hbm2java" basedir=".">

	<!-- classpath necesario -->
	<path id="lib.class.path">
		<pathelement
			location="/home/chuidiang/.m2/repository/velocity/velocity/1.4/velocity-1.4.jar" />
		<pathelement location="/opt/hibernate-3.2/hibernate3.jar" />
		<fileset dir="/opt/hibernate-3.2/lib">
			<include name="*.jar" />
		</fileset>
		<!-- The middlegen jars -->
		<fileset dir="/home/chuidiang/middlegen-2.1">
			<include name="*.jar" />
		</fileset>
	</path>

	<!-- Contruir los fuentes a partir de la hbm2java -->
	<target name="hbm2java">
		<taskdef name="hibernatetool"
			classname="org.hibernate.tool.ant.HibernateToolTask"
			classpathref="lib.class.path" />

		<!-- Configuración -->
		<hibernatetool destdir="src/main/java">
			<configuration>
				<fileset dir="src/main/config">
					<include name="**/*.hbm.xml" />
				</fileset>
			</configuration>
			<hbm2java jdk5="true" />
		</hibernatetool>
	</target>
</project>


Ejecutamos ant[editar]

Puesto que hemos llamado build.xml al fichero, que es el nombre por defecto que busca ant, basta con situarse en el directorio donde está este fichero y ejecutar el comando ant.

$ ant
Buildfile: build.xml

hbm2java:
[hibernatetool] Executing Hibernate Tool with a Standard Configuration
[hibernatetool] 1. task: hbm2java (Generates a set of .java files)
[hibernatetool] log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
[hibernatetool] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 7 seconds


El resultado[editar]

Según la configuración que tengo puesta en el anterior .cfg.hbm, el fichero .java obtenido es

package com.chuidiang.beans;

// Generated 01-dic-2007 17:58:23 by Hibernate Tools 3.2.0.CR1

import java.sql.Date;

/**
 * Coche generated by hbm2java
 */
public class Coche implements java.io.Serializable {

    private Integer idCoche;
    private String marca;
    private String matricula;
    private Date fechaMatricula;
    private int idPropietario;
    private int id;

    public Coche() {
    }

    public Coche(Integer idCoche, int idPropietario, int id) {
        this.idCoche = idCoche;
        this.idPropietario = idPropietario;
        this.id = id;
    }

    public Coche(Integer idCoche, String marca, String matricula,
            Date fechaMatricula, int idPropietario, int id) {
        this.idCoche = idCoche;
        this.marca = marca;
        this.matricula = matricula;
        this.fechaMatricula = fechaMatricula;
        this.idPropietario = idPropietario;
        this.id = id;
    }

    public Integer getIdCoche() {
        return this.idCoche;
    }

    public void setIdCoche(Integer idCoche) {
        this.idCoche = idCoche;
    }

    public String getMarca() {
        return this.marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public String getMatricula() {
        return this.matricula;
    }

    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }

    public Date getFechaMatricula() {
        return this.fechaMatricula;
    }

    public void setFechaMatricula(Date fechaMatricula) {
        this.fechaMatricula = fechaMatricula;
    }

    public int getIdPropietario() {
        return this.idPropietario;
    }

    public void setIdPropietario(int idPropietario) {
        this.idPropietario = idPropietario;
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

}

Listo para ser usado en nuestro código java, con o sin Hibernate