Jugando con Hibernate

Me he puesto a jugar un poco con Hibernate y me ha encantado, aunque también he empezado a odiar ciertas cosas.

Primero intenté crear un proyecto maven con hibernate, para obtener los jar de forma automática. Por ahí surgieron mis primeros poblemas. Encontré en el repositorio maven un groupId "hibernate" y otro "org.hibernate" y, por supuesto, en el primer intento me equivoqué.

En org.hibernate -el que al final usé- otra sorpresa. Los números de versión son raros porque llevan una letras detrás, por lo que ya no sabes qué bajarte. Si no hay letras, está claro, el último número, pero con letras…. Me decido por uno. Mis segundos problemas y comienzos del odio fue que no se bajó el jta.jar. Eso, hasta cierto punto es normal. El jta.jar es de sun y sun no permite que otros distribuyan sus jar. Hay que ir a la página de sun y bajárselo. Me voy a la página de sun … y jta.jar pertenece al paqute JEE. ¿Por qué me tengo que bajar JEE si sólo hago aplicaciones de escritorio?.

No obstante, intenté bajarme e instalar JEE … en linux. Error al desempaquetar el paquete porque me falta no sé qué ¿versión concreta, con números, de una librería de C++?. ¿Tengo que tener instalada una versión concreta de la librería C++ para desempaquetar JEE?. ¡¡ Paso de JEE !!. ¡A ver si al final tengo que recompilar el kernel!

Me fuí a la página de Hibernate y me bajé Hibernate core. Me costó un buen rato decidir qué bajaba. No conozco Hibernate, pero sí sé lo que quería: ¡No depender de JEE!. Tarea casi imposible. En cualquier sitio de Hibernate que te metas, por mucho J2SE que ponga en el enlace, empieza a mencionar EJBs y JBoss.

Bueno, ya he protestado bastante. No me gusta nada la página de Hibernate, no me parece clara y hay que darle demasiadas vueltas hasta encontrar lo que quieres. Vamos ahora con lo bueno.

Como dije, me bajé Hibernate core y ahí sí venía el jta.jar y por suerte, no venía el JEE. ¿Por qué sun deja distribuir a Hibernate su jta.jar y no deja a Maven?. Luego, un ojo a la documentación para seguirla y tratar de hacer algo.

Y ahí empecé a maravillarme de sus posibilidades.

Por un lado, según Hibernate hay tres formas de definir la base de datos. Podemos tener la base de datos en sí. Podemos hacer un fichero xml al estilo Hibernate en que se relacionen tablas de base de datos con beans de java y las columnas de las tablas con los atributos del bean. Y finalmente, podemos tener beans java con "annotations". Eso de las annotations no es más que poner encima de los atributos java cosas como @id, @column de forma que con esto indicamos qué es cada atributo del bean en la base de datos.

Primera maravilla. A partir de cualquiera de esas tres, Hibernate es capaz de generar las otras dos. Si yo escribo el fichero xml, Hibernate crea las tablas en base de datos y el código java de los beans. Si tengo la base de datos, Hibernate crea el fichero xml y los fuentes java de los beans. Y si tengo ya los beans hechos, con sus annotations, Hibernate crea las tablas de base de datos de y el fichero xml. Por supuesto, todo eso opcional. En mi caso, las tablas de datos en el trabajo están hechas. Sacaría de ellas el xml y los beans.

Por supuesto, permite relaciones entre beans/tablas de las típicas uno a uno, uno a muchos, muchos a muchos. En los beans java simplemente son atributos Hash, List o lo que sea y en las tablas incluso crea las tablas intermedias con los dos índices de las relaciones.

Unas peguillas: Lo de generar la base de datos a partir del xml, en el ejemplo que pone la documentación viene que se haga automático. Así que mi primera prueba se cargó la tabla de base de datos que tenía, con sus datos, y me la creo de cero. Ahí que tener cuidado con estas cosas. La otra peguilla es que para esto necesitas "Hibernate tools", pero entre que viene para usar con ant o como plugin de eclipse que no me ha funcionado de momento, pues de momento no soy capaz de hacer nada de eso -salvo cargarme la base de datos la primera prueba-. Es la primera herramienta que veo que dan la opción "destructiva" fácilmente accesible como ejemplo y las opciones "constructivas" escondidas entre scripts crípticos de ant.

Segunda maravilla. Una vez configurado todo, desde código java puedo obtener a través de Hibernate un bean correspondiente a un registro de una tabla. Pues bien, cualquier modificación en los datos que haga de ese bean en el código java, se refleja automáticamente en la base de datos. Cuando termine las modificaciones, puedo hacer un commit() o un rollback() para confirmar o cancelar los cambios. Con Hibernate, en un momento dado, podemos olvidarnos totalmente de que hay una base de datos detrás y de todas las sql, salvo, quizás, para la carga inicial de datos. Los beans son realmente persistentes en BD, sin necesidad de código separado para insertarlos o modificarlos en base de datos.

Seguiré investigando y jugando con el tema porque creo que sí que merece la pena usar una herramienta como esta. Me da "cosa" que esté tan "casada" con JEE y JBoss. También me dan las dudas de eficiencia luego en tiempo de ejecución, pero hasta que no se pruebe, no se sabe. En cualquier caso, sólo con que de una tabla de BD te saque el código java de los beans, ya merece la pena.

Entradas relacionadas:

  • No hay entradas relacionadas.

6 comentarios en “Jugando con Hibernate

  1. Felicitaciones por haber comenzado con la investigacion de hibernate, me siento un poco responsable de darte el ultimo empujon con mi comentario en un post anterior.

    Algo que te tenes que fijar por el tema de rendimiento es ‘lazy initialization’, esto es que realiza las consultas a base de datos para cargar las propiedades del bean solo cuando realmente son necesarias (usadas), ahorrandote cargas de datos innecesarias

    saludos

  2. En mi caso estamos trabajando con Hibernate , y aunque tenemos claro que seguiremos con Hibernate, estamos haciendo pruebas de rendimiento. Te comento como resumen de las pruebas que hemos hecho hasta el momento que la diferencia entre utilizar DAOs y utilizar Hibernate es muy pequeña, hasta podría decir que inapreciable. Nos falta realizar pruebas con tablas que tienen muchas relaciones (pero muchas) y muchas filas (pero muchas).

    En cuanto al comentario de eynob acerca del ‘lazy’, es muy importante saber cuando utilizar ‘lazy’ y cuando no ya que puede penalizar el rendimiento o mejorarlo.
    Saludos

  3. Hola muy bueno tu articulo!!! No me mandarias el codigo de la aplicacion que hiciste o un ejemplo.??
    Quiero hacer solo una aplicacion de consola pero no logro configurar para que ande!!
    muchas gracias

  4. Hola:

    Precisamente ayer acababa de retomar lo de hibernate y el ejemplo que viene en la documentación corre perfectamente… si sabes un par de trucos. Básicamente es que además de los jar de hibernate, debes usar el jar con el conector a la base de datos y debes descargarte el jar de http://www.slf4j.org/faq.html . Debes, además, asegurarte de que las versiones del jar slf4j-api que viene con hibernate y el slf4j-log4j que te bajas son las misma.

    Posiblemente mañana o pasado escriba amplíe el ejemplo de http://www.chuidiang.com/chuwiki/index.php?title=Introducci%C3%B3n_a_Hibernate con estos detalles.

    Se bueno.

  5. Pingback: Diario de Programación » Blog Archive » Otra vez Hibernate

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.