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.Setcategorias; @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 https://adictosaltrabajo.com maven-compiler-plugin 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.
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!
Por cierto… para realizar ingeniería inversa necesitaréis añadir una dependencia al plugin, la CGLib:
cglib
cglib
2.2