Hibernate
Hibernate
Uso
Hibernate es un framework de mapeo objeto-relacional (ORM) ampliamente utilizado en aplicaciones Java para interactuar con bases de datos. Su propósito principal es simplificar y optimizar el manejo de datos persistentes al permitir que los desarrolladores trabajen con objetos en lugar de escribir directamente consultas SQL. A continuación, se enumeran las principales razones para utilizar Hibernate:
- Simplificación del manejo de datos persistentes Hibernate abstrae las complejidades del manejo de datos en bases de datos relacionales: No es necesario escribir código SQL explícito para operaciones comunes (inserción, actualización, eliminación, consulta). Se trabaja directamente con objetos Java (entidades), que Hibernate mapea automáticamente a tablas de la base de datos.
- Portabilidad y soporte para múltiples bases de datos Hibernate es compatible con diferentes sistemas de bases de datos: Cambiar de una base de datos a otra requiere poco o ningún cambio en el código. La configuración del dialecto de base de datos (por ejemplo, MySQL, PostgreSQL, Oracle) permite a Hibernate generar automáticamente SQL adaptado a cada sistema.
- Reducción de código repetitivo Hibernate gestiona operaciones repetitivas y tediosas: Generación automática de consultas SQL para CRUD. No es necesario escribir manualmente código para abrir y cerrar conexiones, manejar transacciones, etc.
- Gestión automática de relaciones Hibernate soporta y simplifica relaciones entre tablas: Relaciones como uno a uno, uno a muchos y muchos a muchos se modelan como relaciones entre objetos. Maneja automáticamente las claves foráneas y las asociaciones.
- Caché y optimización del rendimiento Hibernate utiliza mecanismos de caché para mejorar el rendimiento: Primer nivel de caché: Caché asociada a la sesión de Hibernate. Segundo nivel de caché: Caché compartida entre sesiones. Reduce la cantidad de consultas SQL enviadas al servidor, optimizando el uso de recursos.
- Generación automática del esquema Hibernate puede generar y actualizar automáticamente el esquema de la base de datos basado en las entidades Java: Facilita el desarrollo rápido y reduce errores de sincronización entre el modelo de datos y el esquema de la base de datos.
- Lenguaje de consultas HQL Hibernate Query Language (HQL) es un lenguaje orientado a objetos para escribir consultas: Similar a SQL pero centrado en objetos Java, lo que facilita el desarrollo. HQL abstrae las diferencias entre dialectos SQL de diferentes bases de datos.
- Soporte para transacciones Hibernate integra fácilmente la gestión de transacciones: Proporciona control explícito sobre las transacciones (commit, rollback). Compatible con transacciones distribuidas a través de JTA (Java Transaction API).
- Comunidad activa y extensibilidad Hibernate cuenta con una comunidad activa que ofrece soporte y documentación. Es extensible para cubrir necesidades específicas, como estrategias de mapeo personalizadas.
- Integración con otros frameworks Hibernate se integra fácilmente con frameworks como: Spring Framework: Para gestionar la inyección de dependencias y transacciones. JPA (Java Persistence API): Hibernate implementa la especificación JPA, lo que lo hace ideal para proyectos que siguen estándares. Ventajas concretas Menor tiempo de desarrollo: Reduce la complejidad del código relacionado con bases de datos. Mantenimiento más sencillo: Cambios en el modelo de datos se reflejan automáticamente en el esquema de la base de datos. Flexibilidad: Soporte para consultas nativas SQL cuando es necesario. Consideraciones al usar Hibernate Curva de aprendizaje: Requiere tiempo para aprender su configuración y conceptos como lazy loading, transacciones y caché. Sobrecarga: En aplicaciones pequeñas, puede ser excesivo frente a soluciones más ligeras como JDBC. Configuración inicial: Aunque potente, puede ser complejo configurarlo correctamente en proyectos grandes. En general, Hibernate es una excelente opción para aplicaciones Java que requieren manejo eficiente de datos persistentes y buscan reducir el esfuerzo de desarrollo y mantenimiento.
Caso práctico
Con la siguiente estructura SQL:
1
2
3
4
5
6
7
8
CREATE DATABASE canciones;
CREATE TABLE `song` (
`songId` int(11) NOT NULL AUTO_INCREMENT,
`songName` varchar(25) NOT NULL,
`singer` varchar(25) NOT NULL,
PRIMARY KEY (`songId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-
Añadimos las librerías, deben quedar de la siguiente manera:

-
Añadimos una clase con el siguiente contenido:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
// Seleccionamos el nombre de la tabla
@Table(name = "song")
// POJO class
public class Song {
// Indicamos el tipo ID y le marcamos el nombre de la columna, en este caso songId. Después le marcamos el tipo de dato, en este caso **int** y el nombre de la variable id.
@Id @Column(name = "songId") private int id;
// Indicamos el nombre de la segunda columna **songName**. Después le marcamos el tipo de dato, en este caso **String** y el nombre de la variable songName.
@Column(name = "songName") private String songName;
// Indicamos el nombre de la tercera columna **singer**. Después le marcamos el tipo de dato, en este caso **String** y el nombre de la variable artist.
@Column(name = "singer") private String artist;
// Método con el cual devolvemos el ID
public int getId() { return id; }
// Método con el cual establecemos el ID
public void setId(int id) { this.id = id; }
// Método con el cual devolvemos el nombre de la canción
public String getSongName() { return songName; }
// Método con el cual establecemos el nombre de la canción
public void setSongName(String songName)
{
this.songName = songName;
}
// Método con el cual devolvemos el nombre del artista
public String getArtist() { return artist; }
// Método con el cual establecemos el nombre del artista
public void setArtist(String artist)
{
this.artist = artist;
}
}
- Los import:
1
2
3
4
5
6
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
- Trabajando con las sesiones:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void crearSession(){
// Paso 1: Crear una instancia de la clase Configuration
Configuration configuration = new Configuration();
// Paso 2: Configurar Hibernate cargando la configuración desde "hibernate.cfg.xml"
configuration.configure("hibernate.cfg.xml");
// Paso 3: Agregar la clase Song como una clase anotada en la configuración de Hibernate
configuration.addAnnotatedClass(Song.class);
// Paso 4: Construir la fábrica de sesiones (SessionFactory) utilizando la configuración
this.sessionFactory = configuration.buildSessionFactory();
}
- CRUD
Create
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void crearCancion(String songName, String artist) {
// Intenta abrir una sesión utilizando la fábrica de sesiones existente
try (Session session = this.sessionFactory.openSession()) {
// Inicia una transacción en la sesión
session.beginTransaction();
// Crea una nueva instancia de la clase Song y establece sus propiedades
Song nuevo = new Song();
nuevo.setSongName(songName);
nuevo.setArtist(artist);
// Guarda la nueva instancia de Song en la base de datos
session.save(nuevo);
// Realiza commit para confirmar la transacción
session.getTransaction().commit();
// Cierra la sesión después de completar las operaciones
session.close();
}
}
Read
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void crearCancion(String songName, String artist) {
// Intenta abrir una sesión utilizando la fábrica de sesiones existente
try (Session session = this.sessionFactory.openSession()) {
// Inicia una transacción en la sesión
session.beginTransaction();
// Crea una nueva instancia de la clase Song
Song nuevo = new Song();
// Establece el nombre de la canción y el artista en la instancia de Song
nuevo.setSongName(songName);
nuevo.setArtist(artist);
// Guarda la nueva instancia de Song en la base de datos
session.save(nuevo);
// Realiza commit para confirmar la transacción
session.getTransaction().commit();
// Cierra la sesión después de completar las operaciones
session.close();
}
}
Update
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void actualizarProducto(int id, String songName, String artist) {
// Intenta abrir una sesión utilizando la fábrica de sesiones existente
try (Session session = this.sessionFactory.openSession()) {
// Inicia una transacción en la sesión
session.beginTransaction();
// Obtén el objeto Song de la base de datos con el id proporcionado
Song cancion = session.get(Song.class, id);
// Actualiza los campos si se encuentra el objeto Song
if (cancion != null) {
// Establece el nuevo nombre de la canción y artista
cancion.setSongName(songName);
cancion.setArtist(artist);
}
// Realiza commit para confirmar la transacción
session.getTransaction().commit();
// Cierra la sesión después de completar las operaciones
session.close();
}
}
Delete
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void eliminarProducto(int id) {
// Intenta abrir una sesión utilizando la fábrica de sesiones existente
try (Session session = this.sessionFactory.openSession()) {
// Inicia una transacción en la sesión
session.beginTransaction();
// Obtén el objeto Song de la base de datos con el id proporcionado
Song cancion = session.get(Song.class, id);
// Elimina el objeto Song si se encuentra
if (cancion != null) {
// Utiliza el método delete para eliminar la instancia de Song de la base de datos
session.delete(cancion);
}
// Realiza commit para confirmar la transacción
session.getTransaction().commit();
// Cierra la sesión después de completar las operaciones
session.close();
}
}
Para finalizar la sesión:
1
2
3
4
void cerrar() {
// Cierra la fábrica de sesiones
this.sessionFactory.close();
}
- Añadimos un archivo XML dento de nuestro proyecto, se debe llamar hibernate.cfg.xml con el siguiente contenido: ``` <?xml version = “1.0” encoding = “utf-8”?> <!DOCTYPE hibernate-configuration PUBLIC “-//Hibernate/Hibernate Configuration DTD 3.0//EN” “http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd”>
```
Esto es todo.
This post is licensed under
CC BY 4.0
by the author.