miércoles, 30 de septiembre de 2009

Hibernate Annotations - Guia Rápida

En este post planeo explicar un poco sobre cómo utilizar hibernate annotations para proyectos Java SE. Antes que nada aclaro que se puede usar hibernate a través de la jpa, pero personalmente tengo razones para pensar que la JPA está todavía un poco chica como para Hibernate.

Para una guia de mapeo les recomiendo bajar la documentación de Hibernate-Annotations

Para los que no sepan de que estoy hablando lo pongo con palabras simples, hibernate es una librería que se encarga de "conectar" el mundo de la programación orientada a objetos con el mundo de las bases de datos relacionales. Algunos conocen esto como ORM o para los mortales, mapeo objeto-relacional.

No voy a dar mucha introducción al tema, debido a que puede ser un poco largo y espero que quien me esté leyendo lo haga porque comprende el tema y quiera ir directo al grano.

Para empezar hibernate utiliza un archivo xml de configuración

<?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.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/prueba</property>
<property name="hibernate.connection.username">prueba</property>
<property name="hibernate.connection.password">prueba</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<mapping package="pruebahibernate.entidades"/>
</session-factory>
</hibernate-configuration>


Este archivo debe llamarse hibernate.cfg.xml y va ubicado en la raíz de nuestra estructura de paquetes.

Como nota recordar poner el driver jdbc de nuestra base de datos relacional entre las librerías (así como las de hibernate annotations, y core). En mi caso utilizo PostgreSQL con una base de datos "prueba" con usuario y clave también prueba.

Todas mis clases de entidad se encuentran en el paquete pruebahibernate.entidades y además de eso tengo habilitada la actualización automática y generación de las tablas en la base de datos.

¿Como se usa?

Necesitamos un objeto Session Factory, esto es lo principal para generar Sesiones de hibernate y con ellas hacer cosas locas con nuestra base de datos. La siguiente línea levanta las configuraciones de nuestro xml, las aplica y crea un session factory con ellas. (Las podemos toquetear por código antes de crear el session factory.
Notar que la diferencia con hibernate standard es que se usa el objeto AnnotationConfiguration en vez del Configuration.


SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

...
Session sesion = sessionFactory.openSession();
Transaction t = sesion.beginTransaction();
....
List l = sesion.createQuery("FROM Persona").list(); //Generar un listado de personas por ejemplo.
....
t.commit();
....

Y eso es todo, con muy pocas líneas y un par de annotations, tenemos un sistema robusto y transaccional para trabajar con bases de datos.

Ahora muestro como está mapeada mi entidad persona:

@Entity
public class Persona implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator="system-uuid")
    @GenericGenerator(name="system-uuid", strategy="uuid")
    @Column(length=36)
    private String id;

    private String nombre;
    private String apellido;
    private int dni;
    private int edad;

    ....... // aca van los getters y setters
}



Como se verá el mapeo por annotations es mucho mas simple y compacto que con xml.Por ahí pueden parecer muchas annotations para un solo id pero es simplemente para especificarle que me genere automáticamente los UUID, es una maña mia nomas el único annotation requerido es el @Id

Espero que les haya servido, cualquier cosa postear preguntas.

Saludos!

2 comentarios:

  1. soy super novato como armaria la estructura de paquetes con las anotaciones, y todos los demas paquetes de vistas y controladores

    ResponderBorrar
  2. Hmm vos querés saber como indicarle a Hibernate adonde estan las entidades que vas a usar con la db?

    Se hace en el xml de configuraciñon de hibernate usando la siguiente línea.

    <mapping package="pruebahibernate.entidades"/>

    ResponderBorrar