# Hibernate

Hibernate es una herramienta de mapeo objeto-relacional (ORM) para la plataforma Java (y disponible también para .Net con el nombre de NHibernate) que facilita el mapeo de atributos entre una base de datos relacional tradicional y el modelo de objetos de una aplicación, mediante archivos declarativos (XML) o anotaciones en los beans de las entidades que permiten establecer estas relaciones.
Hibernate es software libre, distribuido bajo los términos de la licencia GNU LGPL.

## Características publicadas

Como todas las herramientas de su tipo, Hibernate busca solucionar el problema de la diferencia entre los dos modelos de datos coexistentes en una aplicación: el usado en la memoria de la computadora (orientación a objetos) y el usado en las bases de datos (modelo relacional). Para lograr esto permite al desarrollador detallar cómo es su modelo de datos, qué relaciones existen y qué forma tienen. Con esta información Hibernate le permite a la aplicación manipular los datos en la base de datos operando sobre objetos, con todas las características de la POO. Hibernate convertirá los datos entre los tipos utilizados por Java y los definidos por SQL. Hibernate 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 todos los motores de bases de datos con un ligero incremento en el tiempo de ejecución.
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").
Hibernate para Java puede ser utilizado en aplicaciones Java independientes o en aplicaciones Java EE, mediante el componente Hibernate Annotations que implementa el estándar JPA, que es parte de esta plataforma.

## Historia

Hibernate comenzó en el año 2001 por Gavin King con colegas de Cirrus Technologies como una alternativa al estilo de programación de EJB2, que usa beans como entidades. El objetivo original era ofrecer mejores capacidades de persistencia que las ofrecidas por EJB2, simplificar las complejidades y complementar algunas características necesarias.
A principios de 2003, el equipo de desarrollo de Hibernate lanzó Hibernate 2 y sus sub-versiones sucesivas, que ofrecieron muchas mejoras significativas sobre el primer lanzamiento.
JBoss, Inc. (ahora parte de Red Hat) contrató a los líderes de desarrollo de Hibernate para continuar su desarrollo.
En 2005, se lanzó la versión 3.0 de Hibernate. Las características clave incluyeron:
* Nueva arquitectura de interceptor / devolución de llamada.
* Filtros definidos por el usuario.
* Anotaciones JDK 5.0 (característica de metadatos de Java).
A partir de 2010, Hibernate 3 (versión 3.5.0 y posteriores) fue una implementación certificada de la especificación Java Persistence API 2.0 a través de un envoltorio para el módulo Core que cumple con la norma JSR 317.
En diciembre de 2011, se lanzó Hibernate Core 4.0.0 Final. Esta versión incluye nuevas características, como:
* Soporte de múltiples tenencias.
* Introducción de ServiceRegistry (un cambio importante en la forma en que Hibernate construye y administra los "servicios").
* Mejoras en apertura de sesión con SessionFactory,
* Mejor integración a través de org.hibernate.integrator.spi.Integrator y autodescubrimiento.
* Soporte de internacionalización.
* Códigos de mensaje en el registro.
* Distinción más amplia entre la API, SPI o clases de implementación.
En diciembre de 2013, se lanzó la final de Hibernate ORM 4.3.0. El objetivo de esta versión es tener compatibilidad total con Java Persistence API 2.1.
En agosto de 2015, se lanzó la final de Hibernate ORM 5.0. Las principales mejoras introducidas son:
* Nueva API bootstrap.
* Soporte Spatial/GIS.
* Soporte con Java 8.
* Gestión de transacciones.
* Soporte para conversor de atributos.
* Mejoras en soporte OSGi (Pax Exam y Karaf).
El lanzamiento final de la serie 5.1.x se produjo en noviembre de 2018 con Hibernate 5.1.17.
En mayo de 2018, se lanzó la versión final de Hibernate ORM 5.3. Las principales mejoras implementadas son:
* Resolución de incompatibilidad binaria que se presentó en la versión 5.2 de Hibernate.
* Soporte para el manejo de módulos de Java 9.
* Mejoras en consumo de memoria.
* Soporte para la API de JPA 2.2.
En diciembre de 2018, se lanzó la final de Hibernate ORM 5.4.0. Entre todas las mejoras, las más reseñadas en el artículo del blog de Hibernate son:
* Actualización de JAXB.
* Entidades de grafos mejoradas, con soporte para Java 11.
En diciembre de 2018 empezaron los lanzamientos alpha de Hibernate 6.0. Las características principales que se quieren implementar son:
* Integración SQM.
* Rediseño de Contract Types.
* Integración CDI unificada.

## Versiones JPA soportadas

Los desarrolladores de Hibernate tratan de ajustarse a las especificaciones del modelo de persistencia JPA, que van de la mano de Java EE (mantenida hasta la versión 8 por Oracle) y Jakarta EE (mantenida en la actualidad por Eclipse Foundation). Por eso, a lo largo de su desarrollo en el tiempo, y a medida que JPA ha ido mejorándose, uno de los principales objetivos de Hibernate ha sido adaptarse a la API de la que penden por defecto todos los sistemas que usan Java que usan mapeo entidad-relación.
El histórico de versiones de JPA soportadas es:
* JPA 1.0: Hibernate ORM 3.2+.
* JPA 2.0: Hibernate ORM 3.5+.
* JPA 2.1: Hibernate ORM 4.3+.
* JPA 2.2: Hibernate ORM 5.3+.