Plugin Hibernate3 para Maven

2
8287

Plugin Hibernate3 para Maven

En este tutorial vamos a ver las posibilidades que nos ofrece el plugin de Hibernate3 para Maven.

¿Qué nos aporta este plugin?

Este plugin principalmente nos aporta la siguiente funcionalidad a través de goals de maven:

  • Generación del esquema de base de datos a partir de clases con anotaciones (también desde archivos *.hbm.xml).
  • Generación de los archivos de mapeo (archivos *.hbm.xml) desde clases Java.
  • Generación de clases Java a partir de sus archivos de mapeo (archivos *.hbm.xml).
  • Generación de documentación en HTML del modelo de datos.
  • Generación del archivo de configuración de hibernate (hibernate.cfg.xml).

El camino se hace al andar, un ejemplo:

A continuación vamos a probar el plugin, concremente veremos los tres primeros puntos (uno,dos,tres) basándonos en un ejemplo, modelaremos mediante clases Java anotadas los siguientes requisitos:

  • Un libro tiene un título, un precio y un número de páginas, además un libro pertenece a una única editorial, puede estar escrito por varios autores y puede pertenecer a varias categorías.
  • Un autor tiene un nombre y una dirección de correo, ambos son requeridos y además no puede haber dos autores con el mismo email.
  • Una categoría tiene un nombre requerido y opcionalmente una descripción.
  • Una editorial tiene un nombre y una url, ambos requeridos.

Trabajaremos con el gestor de datos Mysql 5, pero podremos migrarlo fácilmente a Oracle o cualquier otro, simplemente cambiando las propiedades de configuración.

Si quieres trastear, puedes descargarte el código fuente desde clic aquí

Modelo con clases Java anotadas:

Autores de libros:

package com.autentia.tutoriales.bookstore.entities;

import javax.persistence.*;

/**
 * Autor de libros
 * @author Carlos García. Autentia.
 */
@Entity 
@Table(name="autores")
public class Autor {
	
	@Id
	@GeneratedValue
	private int		id;
	
	@Column(length=255, nullable=false)  
	private String	nombre;
	
	@Column(length=200, nullable=false, unique=true)
	private String  email;

	public Autor() {
		super();
	}
	
	public String getNombre() {
		return this.nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getEmail() {
		return this.email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
}

Categorías de libros:

package com.autentia.tutoriales.bookstore.entities;

import javax.persistence.*;

/**
 * Categoría de libros.
 * @author Carlos García. Autentia.
 */
@Entity  
@Table(name="categorias")
public class CategoriaLibro {
	
	@Id
	@GeneratedValue 
	private int		id;
	
	@Column(length=200, nullable=false)  
	private String	nombre;
	
	@Column(length=1024)  
	private String	descripcion;
	
	public CategoriaLibro() {
		super();
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
}

Editoriales de libros:

package com.autentia.tutoriales.bookstore.entities;

import javax.persistence.*;

@Entity
@Table(name="editoriales")
public class Editorial {
	
	@Id
	@GeneratedValue
	private int		id;
	
	@Column(length=200, nullable=false) 
	private String	nombre;
	
	@Column(length=200, nullable=false)
	private String  url;
	
	public Editorial(){
		super();
	}
	
	public String getNombre() {
		return this.nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getUrl() {
		return this.url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
}

Libros:

package com.autentia.tutoriales.bookstore.entities;

import javax.persistence.*;

/**
 * Representa un libro
 * @author Carlos García. Autentia.
 */
@Entity 
@Table(name="libros")
public class Libro {
	
	@Id
	@GeneratedValue
	private int		id;
	
	@Column(length=200, nullable=false) 
	private String	titulo;
	
	private double	precio;
	private short   paginas;
	
	@ManyToOne(optional=false)
	private Editorial editorial;

	@ManyToMany(fetch=FetchType.LAZY)
	private java.util.Set categorias;
	
	@ManyToMany(fetch=FetchType.LAZY)
	private java.util.Set autores;
	
	public Libro(){
		super();
	}
	
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public double getPrecio() {
		return precio;
	}
	public void setPrecio(double precio) {
		this.precio = precio;
	}
	public short getPaginas() {
		return paginas;
	}
	public void setPaginas(short paginas) {
		this.paginas = paginas;
	}
	public Editorial getEditorial() {
		return editorial;
	}
	public void setEditorial(Editorial editorial) {
		this.editorial = editorial;
	}

	public java.util.Set getCategorias() {
		return categorias;
	}
	public void setCategorias(java.util.Set categorias) {
		this.categorias = categorias;
	}
	public java.util.Set getAutores() {
		return autores;
	}
	public void setAutores(java.util.Set autores) {
		this.autores = autores;
	}
}

Propiedades de conexión a la base de datos: /src/main/resources/db.properties:

Este archivo es usado por el plugin a través del archivo de configuración de hibernate (/src/main/resources/hibernate.cfg.xml) y
se relacionan en la configuración del plugin de hibernate 3 para maven a través de su archivo de configuración pom.xml.

hibernate.connection.username=invitado
hibernate.connection.password=invitado
hibernate.connection.url=jdbc:mysql://127.0.0.1/test
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

Archivo de configuración de hibernate /src/main/resources/hibernate.cfg.xml:




    
        ${hibernate.connection.username}
        ${hibernate.connection.password}
        ${hibernate.connection.url}
        ${hibernate.connection.driver_class}
        ${hibernate.dialect}
        
        
        
        
        
        
        

Registramos en el archivo de configuración de Maven (pom.xml) el plugin de Hibernate 3:



	4.0.0
	com.autentia.tutoriales
	bookstore
	jar
	1.0-SNAPSHOT
	book_store
	http://www.adictosaltrabajo.com
	
		
			
			
				maven-compiler-plugin
				
					1.6
					1.6
					UTF-8
				
			
			
			
			
				org.codehaus.mojo
				hibernate3-maven-plugin
				2.2
				
					
					
						
						false							
						
						
						src/main/resources/db.properties
						
						
						boolStore.sql
						
						
						true
					
				
				
					
					
						mysql
						mysql-connector-java
						5.1.6
					
				
			
		
	
	
		
			org.hibernate
			hibernate-annotations
			3.3.1.GA
		
	

Generación del esquema de base de datos a partir de clases (con y sin anotaciones).

Ejecutamos el siguiente comando (compilamos antes por las anotaciones):

mvn compile hibernate3:hbm2ddl.

Resultados del comando:

Archivo generado: target\hibernate3\sql\bookStore.sql
    create table autores (
        id integer not null auto_increment,
        email varchar(200) not null unique,
        nombre varchar(255) not null,
        primary key (id)
    ) ENGINE=InnoDB;

    create table categorias (
        id integer not null auto_increment,
        descripcion varchar(1024),
        nombre varchar(200) not null,
        primary key (id)
    ) ENGINE=InnoDB;

    create table editoriales (
        id integer not null auto_increment,
        nombre varchar(200) not null,
        url varchar(200) not null,
        primary key (id)
    ) ENGINE=InnoDB;

    create table libros (
        id integer not null auto_increment,
        paginas smallint not null,
        precio double precision not null,
        titulo varchar(200) not null,
        editorial_id integer not null,
        primary key (id)
    ) ENGINE=InnoDB;

    create table libros_autores (
        libros_id integer not null,
        autores_id integer not null,
        primary key (libros_id, autores_id)
    ) ENGINE=InnoDB;

    create table libros_categorias (
        libros_id integer not null,
        categorias_id integer not null,
        primary key (libros_id, categorias_id)
    ) ENGINE=InnoDB;

    alter table libros 
        add index FKBE414D3151DCF8E7 (editorial_id), 
        add constraint FKBE414D3151DCF8E7 
        foreign key (editorial_id) 
        references editoriales (id);

    alter table libros_autores 
        add index FK49C77B83877AEB39 (autores_id), 
        add constraint FK49C77B83877AEB39 
        foreign key (autores_id) 
        references autores (id);

    alter table libros_autores 
        add index FK49C77B839C036D78 (libros_id), 
        add constraint FK49C77B839C036D78 
        foreign key (libros_id) 
        references libros (id);

    alter table libros_categorias 
        add index FKF502D56E5B881BC (categorias_id), 
        add constraint FKF502D56E5B881BC 
        foreign key (categorias_id) 
        references categorias (id);

    alter table libros_categorias 
        add index FKF502D56E9C036D78 (libros_id), 
        add constraint FKF502D56E9C036D78 
        foreign key (libros_id) 
        references libros (id);

Captura de MySql Query Browser

Generación de los archivos de mapeo (archivos *.hbm.xml) desde clases Java.

Ejecutamos el siguiente comando:

mvn hibernate3:hbm2hbmxml.

Resultados del comando:

Maven nos deja los archivos generados en el directorio target\hibernate3\generated-mappings

Generación de clases Java a partir de sus archivos de mapeo (archivos *.hbm.xml).

Ejecutamos el siguiente comando:

mvn hibernate3:hbm2java.

Resultados del comando:

Maven nos deja los archivos generados en el directorio target\hibernate3\generated-sources

Conclusiones

Sin lugar a dudas, Maven ha supuesto un antes y un después en la construcción de proyectos, en este caso, este plugin es una alternativa ideal a usar ant con hibernate tools.

En Autentia, estamos constantemente formándonos para conocer cuales son las herramientas que hay en el mercado y cuales se adaptan mejor en cada caso. Espero nos tengais en cuenta si necesitais algún tipo de consultaría o formación a medida.

Bueno, eso es todo, un saludo.
Carlos García. Creador de MobileTest.

cgpcosmad@gmail.com

2 COMENTARIOS

  1. Increible, siempre me ha costado muchísimo configurar el Hibernate Tools para Eclipse para poder conseguir lo que ahora me hace Maven… Hace poco que empiezo a utilizar Maven2 por mi cuenta (antes todo estaba ya hecho en los proyectos en lo que trabajo) y este tutorial me ha servido muchísimo para proyectos personales.

    He hecho una adaptación mínima, para poder usar HSQLDB, y he de decir que los resultados son fantásticos.

    Gracias por vuestra inestimable ayuda, como siempre!

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad