Curso J2EE (3ª semana) - Hibernate
Comenzamos los dos días de esta semana con una pequeña introducción por las principales características de los principales frameworks de persistencia: EJB, JDO, Hibernate, JPA.
Pero una vez pasada esta breve introducción la chicha fué hibernate, que nos ocupó prácticamente los dos días completos.
Hibernate como todo ORM surge por la necesidad de solucionar la existencia de 2 paradigmas diferentes: Modelo de objetos - Modelo relacional. Hibernate es libre, lleva mucho tiempo en el mercado y ha alcanzado un gran estado de madurez, utiliza ficheros xml para mapear las relaciones entre BD y objetos aunque en su última versión 3.0 incluye el uso de anotaciones como alternativa. Hibernate nos ahorra escribir mucho código, emplea POJOS para leer y escribir de la BD y cuenta con un potente lenguaje de consultas "HQL" para aquellas situaciones mas particulares o complejas. Como principal inconveniente un rendimiento necesariamente más bajo que utilizando unas buenas consultas jdbc.
Para comenzar con hibernate necesitaremos el driver jdbc de nuestro motor de BD y el hibernate.jar. A partir de aquí creando los ficheros de configuración ya podemos comenzar a realizar ejemplos básicos.
Debemos saber que el fichero principal de configuración de hibernate es hibernate.cfg.xml que tendrá una estructura como esta, en la que por ejemplo especificamos los parametros de nuestra conexión:
-
<hibernate-configuration>
-
<session-factory>
-
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
-
<property name="connection.url">jdbc:mysql://localhost:3306/library</property>
-
<property name="connection.username">root</property>
-
<property name="connection.password">admin1</property>
-
<property name="connection.pool_size">1</property>
-
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
-
<property name="current_session_context_class">thread</property>
-
<property name="show_sql">true</property>
-
<property name="hbm2ddl.auto">none</property>
-
<mapping class="net.jsanroman.hibernate.model.Post"></mapping>
-
</session-factory>
-
</hibernate-configuration>
La comunicación con el motor de Hibernate la haremos mediante un objeto Session, pero para obtenerlo utilizaremos 2 classes mas: SessionFactory (que contiene los metadatos e información de clases java), Configuration (para la configuración de hibernate: ficheros de mapeo, dialecto de bd..., también inicia hibernate y nos da el acceso al SessionFactory).
Un ejemplo muy sencillo:
-
private SessionFactory factory = new Configuration().configure().buildSessionFactory();
-
Session sess = factory.openSession();
-
Transaction tx;
-
try {
-
tx = sess.beginTransaction();
-
//do some work
-
...
-
tx.commit();
-
}
-
if (tx!=null) tx.rollback();
-
throw e;
-
}
-
finally {
-
sess.close();
-
}
Ahora que ya tenemos configurada la conexión con nuestro motor de BD a través de hibernate, nos toca crear nuestro modelo de objetos y mapear los xml para asociarlos al modelo de BD. Hibernate utiliza Java Reflection para acceder a las propiedades de nuestros objetos, por lo que cada propiedad debe tener sus correspondientes getters y setters, y cada clase de nuestro modelo su propio constructor vacío.Una vez tenemos nuestro modelo de objetos construido debemos crear un fichero xml por cada objeto (si mapeamos la relación con la BD a través de anotaciones no sería necesario) por convención lo llamaremos NombreObjetoAMapear.hbm.xml. En este enlace tenemos toda la información sobre la sintaxis necesaria en estos xml para poder mapear cualquier tipo de relación. No nos olvidemos de que todos estos xml de mapeo deben referenciarse en el hibernate.cfg.xml de la siguiente forma:
-
<mapping class="net.jsanroman.hibernate.model.Post">
A partir de aquí ya podemos comenzar a investigar y hacer todas las pruebas necesarias para conocer hibernate mas a fondo: consultas de selección, actualizacion, insercción, eliminación, con HQL, components (misma fila BD a varios objetos; varias filas BD a un objeto), tipos de relaciones (many-to-one; one-to-many; one-to-one; many-to-many), el atributo cascade (save_update; all-delete-orphan), utilizar anotaciones en lugar de xml, etc.
Como conclusión comentar que me ha gustado trabajar con hibernate, me parece mucho mas productivo que la utilización de DAOS al ahorrarnos escribir una buena cantidad de código repetitivo, y la curva de aprendizaje para comenzar a obtener resultados es realmente baja. Para situaciones complejas siempre podemos utilizar su lenguaje de consultas HQL o el propio SQL.
Creo que la semana que entra le tocará a EJB, ya os contaré.














