Hibernate ORM (o simplemente Hibernate ) es una herramienta de mapeo objeto-relacional [2] : §1.2.2, [12] para el lenguaje de programación Java . Proporciona un marco para mapear un modelo de dominio orientado a objetos a una base de datos relacional . Hibernate maneja problemas de desajuste de impedancia objeto-relacional al reemplazar accesos directos y persistentes a la base de datos con funciones de manejo de objetos de alto nivel.
Hibernate es un software libre que se distribuye bajo la Licencia Pública General Reducida GNU 2.1.
La característica principal de Hibernate es la asignación de clases Java a tablas de bases de datos y de tipos de datos Java a tipos de datos SQL . Hibernate también proporciona funciones de consulta y recuperación de datos. Genera llamadas SQL y libera al desarrollador de la manipulación manual y la conversión de objetos del conjunto de resultados.
La asignación de clases Java a tablas de bases de datos se implementa mediante la configuración de un archivo XML o mediante el uso de anotaciones Java . Cuando se utiliza un archivo XML, Hibernate puede generar un código fuente básico para las clases de persistencia. Esto es auxiliar cuando se utilizan anotaciones. Hibernate puede utilizar el archivo XML o las anotaciones Java para mantener el esquema de la base de datos .
Se proporcionan facilidades para organizar relaciones de uno a muchos y de muchos a muchos entre clases. [2] : 140–171 Además de gestionar asociaciones entre objetos, Hibernate también puede gestionar asociaciones reflexivas en las que un objeto tiene una relación de uno a muchos con otras instancias del tipo de clase .
Hibernate admite la asignación de tipos de valores personalizados. Esto permite que se den los siguientes casos:
Definición: Los objetos en una aplicación orientada a objetos siguen los principios de OOP , mientras que los objetos en el back-end siguen los principios de normalización de bases de datos , lo que da como resultado diferentes requisitos de representación. Este problema se denomina " desajuste de impedancia objeto-relacional ". El mapeo es una forma de resolver el problema de desajuste de impedancia objeto-relacional.
El mapeo informa a la herramienta ORM qué objeto de clase Java almacenar en qué tabla de base de datos.
Hibernate proporciona un lenguaje inspirado en SQL llamado Hibernate Query Language (HQL) para escribir consultas similares a SQL contra los objetos de datos de Hibernate. Criteria Queries se proporcionan como una alternativa orientada a objetos a HQL. Criteria Query se utiliza para modificar los objetos y proporcionar la restricción para los objetos. [2] : 347–349 HQL (Hibernate Query Language) es la versión orientada a objetos de SQL. Genera consultas independientes de la base de datos, por lo que no hay necesidad de escribir consultas específicas de la base de datos. Sin esta capacidad, cambiar la base de datos requeriría que también se cambiaran las consultas SQL individuales, lo que genera problemas de mantenimiento.
Hibernate proporciona persistencia transparente para objetos de Java simples (POJO). [2] : 37–38 El único requisito estricto para una clase persistente es un constructor sin argumentos , [2] : 39 aunque no necesariamente public
. El comportamiento adecuado en algunas aplicaciones también requiere una atención especial a los métodos equals(Object obj)
y hashCode()
en las Object
clases. [3] Hibernate recomienda proporcionar un atributo de identificador, y se planea que esto sea un requisito obligatorio en una versión futura. [4]
Las colecciones de objetos de datos se almacenan normalmente en clases de colección de Java, como implementaciones de las interfaces Set
y List
. También se admiten los genéricos de Java , introducidos en Java 5. Hibernate se puede configurar para cargar de forma diferida las colecciones asociadas. [2] : 289–293 La carga diferida es la opción predeterminada a partir de Hibernate 3.
Los objetos relacionados se pueden configurar para realizar operaciones en cascada de un objeto a otro. Por ejemplo, un Album
objeto de clase principal se puede configurar para realizar operaciones en cascada de sus operaciones save
y delete
a sus Track
objetos de clase secundarios.
Hibernate se puede utilizar tanto en aplicaciones Java independientes como en aplicaciones Java EE que utilicen servlets , beans de sesión EJB y componentes de servicio JBI . También se puede incluir como una característica en otros lenguajes de programación. Por ejemplo, Adobe integró Hibernate en la versión 9 de ColdFusion (que se ejecuta en servidores de aplicaciones J2EE) con una capa de abstracción de nuevas funciones y sintaxis agregadas en CFML .
En la jerga de Hibernate , una entidad es un objeto independiente en el mecanismo persistente de Hibernate que se puede manipular independientemente de otros objetos. [2] : 62–74 Por el contrario, un componente está subordinado a una entidad y se puede manipular solo con respecto a esa entidad. Por ejemplo, un objeto Álbum puede representar una entidad; pero el objeto Pistas asociado con los objetos Álbum representaría un componente de la entidad Álbum, si se supone que las Pistas solo se pueden guardar o recuperar de la base de datos a través del objeto Álbum. A diferencia de J2EE, Hibernate puede cambiar de base de datos.
Hibernate fue creado en 2001 por Gavin King y colegas de Cirrus Technologies como una alternativa al uso de beans de entidad de estilo EJB2. El objetivo original era ofrecer mejores capacidades de persistencia que las ofrecidas por EJB2, simplificando las complejidades y complementando ciertas funciones faltantes.
A principios de 2003, el equipo de desarrollo de Hibernate comenzó a lanzar Hibernate2, que ofrecía muchas mejoras significativas con respecto a la primera versión.
Posteriormente, JBoss, Inc. (ahora parte de Red Hat ) contrató a los principales desarrolladores de Hibernate para impulsar su desarrollo.
En 2005, se lanzó la versión 3.0 de Hibernate. Las características principales incluían una nueva arquitectura de interceptor/devolución de llamadas, filtros definidos por el usuario y anotaciones JDK 5.0 (la característica de metadatos de Java ). A partir de 2010 [actualizar], Hibernate 3 (versión 3.5.0 y posteriores) era una implementación certificada de la especificación Java Persistence API 2.0 a través de un contenedor para el módulo Core que proporciona conformidad con el estándar JSR 317. [5]
En diciembre de 2011 se lanzó Hibernate Core 4.0.0 Final. Incluye nuevas características como compatibilidad con múltiples inquilinos, introducción de ServiceRegistry (un cambio importante en la forma en que Hibernate crea y administra "servicios"), mejor apertura de sesiones desde SessionFactory, integración mejorada a través de org.hibernate.integrator.spi.Integrator y detección automática, compatibilidad con internacionalización , códigos de mensajes en el registro y una mayor distinción entre API, SPI o clases de implementación. [6]
En diciembre de 2012, se lanzó Hibernate ORM 4.1.9 Final. [7]
En marzo de 2013, se lanzó Hibernate ORM 4.2 Final. [8]
En diciembre de 2013, se lanzó Hibernate ORM 4.3.0 Final. [9] Incluye Java Persistence API 2.1 .
En septiembre de 2015 se lanzó Hibernate ORM 5.0.2 Final. Tiene mejoras en el arranque y compatibilidad con hibernate-java8, hibernate-spatial y Karaf.
En noviembre de 2018 se lanzó Hibernate ORM 5.1.17 Final. Se trata de la versión final de la serie 5.1.
En octubre de 2018, se lanzó Hibernate ORM 5.3 Final, que incluía el almacenamiento en caché de herencia de Java Persistence API 2.2 .
En diciembre de 2018, se lanzó Hibernate ORM 5.4.0 Final. [10]
En octubre de 2022, se lanzó Hibernate ORM 6.1.4 Final. [11]
La API de Hibernate se proporciona en el paquete Java org.hibernate
. [12]
La org.hibernate.SessionFactory
interfaz es la versión nativa equivalente del estándar JPA EntityManagerFactory
. [2] : 26
La org.hibernate.Session
interfaz [13] representa una sesión de Hibernate, es decir, el punto principal de la manipulación realizada sobre las entidades de la base de datos. Las últimas actividades incluyen (entre otras cosas) la gestión del estado de persistencia ( transitorio , persistente , separado [ aclaración necesaria ] ) de los objetos, la obtención de los persistentes de la base de datos y la gestión de la demarcación de transacciones [ aclaración necesaria ] .
A Session
está pensado para durar tanto como la transacción lógica en la base de datos. Debido a esta última característica, Session
no se espera que las implementaciones sean seguras para subprocesos ni que sean utilizadas por varios clientes.
El software Hibernate incluye los siguientes componentes: [14]