Hibernate

RECU-0097 (Recurso Ficha Técnica)

Descripción

Como información previa para entender que es Hibernate, explicamos el concepto de mapeador objeto-relacional (ORM).

La programación orientada a objetos y bases de datos relacionales son dos paradigmas diferentes. El modelo relacional trata con relaciones y conjuntos. Sin embargo, el paradigma orientado a objetos trata con objetos, sus atributos y asociaciones de unos a otros.

Un ORM es un sistema que permite almacenar objetos de aplicaciones Java en tablas de sistemas de bases de datos relacionales usando metadatos que describen la relación entre los objetos y la base de datos, y lo hace de una manera transparente y autónoma.

Hibernate parte de una filosofía de mapear objetos Java, también conocidos como “POJOs” (Plain Old Java Objects). Con Hibernate no es necesario escribir código específico en nuestros objetos ni hacer que hereden de clases determinadas. En vez de eso trabajamos con ficheros XML y objetos que proporciona la librería. Una de las principales características de Hibernate es su flexibilidad, envolviéndolo todo bajo un marco de trabajo común.

Ventajas e inconvenientes

Entre las principales características técnicas que aporta Hibernate están las siguientes:

  • Modelo de programación natural. Hibernate es una capa de persistencia objeto/relacional que e permite diseñar objetos persistentes que podrán incluir polimorfismo, relaciones, colecciones, y un gran número de tipos de datos.
  • Gran escalabilidad. Hibernate es muy eficiente, tiene una arquitectura de caché de doble capa y podrí­a ser usado en un cluster.
  • Hibernate admite los contextos de persistencia de larga vida denominados detach/reattach objetos. Además se ocupa del bloqueo optimista automáticamente.
  • Software libre. Está bajo licencia LGPL (Lesser GNU Public License).
  • EJB 3.0. Hibernate implementa la gestión de la API de la persistencia Java y el mapeado objeto-relacional.
  • Persistencia transparente. Ofrece soporte para un amplio conjunto de las colecciones de Java, propiedades del estilo de persistencia de JavaBeans, etc. que abstraen al usuario.
  • Mapeado flexible gracias a las asociaciones bidireccionales, la persistencia transitiva,colecciones de tipos básicos, etc. el mapeado resulta mucho más flexible.
  • Facilidades en consultas. Debido en parte a que se realizan en un potente lenguaje de consultas orientado a objetos.
  • Facilidades en metadatos. Soporta el formato del mapeado de XML, diseñado para ser editado a mano y el mapeado basado en anotaciones. Además de Validación basada en anotaciones.

Hibernate en su funcionamiento genera las sentencias SQL y libera al desarrollador del manejo manual de los datos que resultan de la ejecución de dichas sentencias, manteniendo la portabilidad entre todas las bases de datos con un ligero incremento en el tiempo de ejecución. A la hora de realizar una optimización en las consultas, el hecho de generar el código en caliente hace que sea mas fácil modificarlo y ajustarlo, cambiando un parámetro de true a false, pasamos de ejecutar todas las sentencia con y sin uniones de tablas, comparase esto con la otra posibilidad, que es cambiar todo a mano. La influencia de Hibernate en la comunidad java ha sido tal, que gran parte de la especificación EJB3 esta basada en él.

Hibernate está diseñado para ser flexible en cuanto al esquema de tablas utilizado, para poder adaptarse a su uso sobre una base de datos ya existente. También tiene la funcionalidad de crear la base de datos a partir de la información disponible.

Hibernate ofrece también un lenguaje de consulta de datos llamado HQL (Hibernate Query Language), al mismo tiempo que una API para construir las consultas programáticamente (conocida como "criteria"). Existe una ramificación de Hibernate conocida como Nhibernate que permite utilizar la misma filosofía en lenguaje C# para su integración en la plataforma .NET.

Hibernate tiene un sistema de doble caché, el primero no se toca, pero el segundo es totalmente configurable, como casi todo en Hibernate, por defecto se usa EHCache, pero se le puede adaptar OSCache, SwarmCache, TreeCache o incluso uno personalizado. Hibernate ofrece pues la posibilidad de utilización de dos tipos de cache (de nivel 1 y de nivel 2).

  • El First Level Cache es el que mantiene automáticamente Hibernate cuando dentro de una transacción interactuamos con la base de datos, en éste caso se mantienen en memoria los objetos que fueron cargados y si mas adelante en el flujo del proceso volvemos a necesitarlos van a ser retornados desde el cache, ahorrando accesos sobre la base de datos. Lo podemos considerar como un cache de corta duración ya que es válido solamente entre el begin y el commit de una transacción, en forma aislada a las demás.
  • El Second Level Cache nos permite ir varios pasos mas adelante en la mejora del rendimiento. La diferencia fundamental es que éste tipo de cache es válido para todas las transacciones y puede persistir en memoria durante todo el tiempo en que el aplicativo esté online, lo podríamos considerar como un cache global. En el segundo nivel de cache Hibernate define cuatro tipos de cache que determinan el aislamiento:
    • transactional: Garantiza un nivel de aislamiento hasta repeatable read. Es el nivel más estricto. Solamente se puede utilizar en clusters, es decir, con cachés distribuidas.
    • read-write: Mantiene un aislamiento hasta el nivel de commited.
    • nonstrict read-write: No ofrece garantía de consistencia entre el caché y la base de datos. Es una estrategia ideal para almacenar datos que no cambian habitualmente y que no sean demasiado críticos.
    • read-only: Es la estrategia de concurrencia menos estricta. Recomendada para datos que nunca cambian.

Es una herramienta que funciona muy bien, gratuita, con una excelente documentación y con gran número de utilidades.

Requisitos e incompatibilidades

Hibernate sólo impone una condición para poder usarse, las tablas deben tener una clave primaria, preferentemente una clave no natural, pero debe poder identificar los registros de alguna manera.

Si bien Hibernate reúne un conjunto de características que lo hacen ser muy llamativo, no es una solución óptima en el caso de proyectos de migración de datos, y si los criterios con que se crearon la base de datos no tienen un mínimo de calidad.

Interacciones

Hibernate es el framework ORM recomendado por MADEJA, da soporte a la especificación JPA y amplía algunas capacidades de esta para mejorar el rendimiento en los mapeos ORM. Además hibernate ofrece buenas relaciones con otros frameworks propuestos por MADEJA

Spring Framework provee amplio soporte para Hibernate. En particular, brinda implementaciones de DAO que ofrecen diversas utilidades para acceder a la session de Hibernate. Spring nos provee la clase HibernateDaoSupport para brindarle a nuestros DAO soporte para Hibernate

Seam convierte en mas manejable la persistencia, introduce el modelo de conversación que resuelve los problemas de programación referentes a la persistencia causados por las arquitectura de aplicaciones no orientadas a estados. Tanto el caso de que se utilice Hibernate o JPA.