Semana 14 - Configuración y Uso de Hibernate en un Proyecto Maven
¿Qué es Hibernate?
Hibernate es un framework de mapeo objeto-relacional (ORM) de código abierto para Java. Permite mapear objetos Java a tablas en una base de datos relacional, facilitando la interacción entre aplicaciones Java y bases de datos sin necesidad de escribir consultas SQL manualmente en la mayoría de los casos. Es ampliamente utilizado para simplificar el acceso a datos en aplicaciones empresariales.
Este documento explica cómo configurar Hibernate 7.0.2.Final en un proyecto Maven y realizar operaciones CRUD básicas.
1. Agregar Dependencias a Maven
Modifica el archivo pom.xml en la raíz del proyecto para incluir Hibernate, el conector MySQL y HikariCP.
Contenido de pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>orm</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<!-- Hibernate ORM -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>7.0.2.Final</version>
</dependency>
<!-- Conector MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- HikariCP para pool de conexiones -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.1.0</version>
</dependency>
<!-- Hibernate HikariCP integration (proporciona HikariCPConnectionProvider) -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-hikaricp</artifactId>
<version>7.0.2.Final</version>
</dependency>
</dependencies>
</project>
Ubicación del archivo: ./pom.xml
Acción: Ejecuta mvn clean install para descargar las dependencias.
2. Configurar Hibernate
Crea el archivo hibernate.cfg.xml en el directorio de recursos con el dialecto correcto para MySQL en Hibernate 7.
Contenido de hibernate.cfg.xml:
<?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">
<hibernate-configuration>
<session-factory>
<!-- Configuración de la base de datos -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">
jdbc:mysql://jdbc:mysql://localhost:3306/tu_base_de_datos</property>
<property name="hibernate.connection.username">tu_usuario</property>
<property name="hibernate.connection.password">tu_contraseña</property>
<!-- Dialecto para Hibernate 7 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Configuración del pool de conexiones HikariCP -->
<!-- Usar el proveedor simple de DriverManager para evitar dependencia adicional -->
<property name="hibernate.connection.provider_class">
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl</property>
<property name="hibernate.hikari.minimumIdle">5</property>
<property name="hibernate.hikari.maximumPoolSize">10</property>
<property name="hibernate.hikari.idleTimeout">300000</property>
<!-- Otras configuraciones -->
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- Mapeo de entidades -->
<mapping class="com.example.Usuario" />
</session-factory>
</hibernate-configuration>
Ubicación del archivo: ./src/main/resources/hibernate.cfg.xml
3. Crear una Entidad
Define una clase Java para mapear una tabla en la base de datos.
Contenido de Usuario.java:
package com.example;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
@Entity
public class Usuario {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nombre;
private String email;
// Getters y setters
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getNombre() { return nombre; }
public void setNombre(String nombre) { this.nombre = nombre; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
Ubicación del archivo: ./src/main/java/com/example/Usuario.java
4. Configurar la SessionFactory
Crea una clase utilitaria para inicializar la SessionFactory.
Contenido de HibernateUtil.java:
package com.example;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
return new Configuration().configure().buildSessionFactory();
} catch (Exception ex) {
System.err.println("Error al crear SessionFactory: " + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
getSessionFactory().close();
}
}
Ubicación del archivo: ./src/main/java/com/example/HibernateUtil.java
5. Realizar Operaciones CRUD
Usa Hibernate para operaciones CRUD.
Contenido de Main.java:
package com.example;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Main {
public static void main(String[] args) {
// Crear un usuario
Usuario usuario = new Usuario();
usuario.setNombre("Juan Pérez");
usuario.setEmail("juan@example.com");
// Guardar el usuario y obtener el id generado
Long usuarioId;
try (Session session = HibernateUtil.getSessionFactory().openSession()) {
Transaction tx = session.beginTransaction();
session.persist(usuario);
tx.commit();
usuarioId = usuario.getId();
System.out.println("Usuario guardado con id: " + usuarioId);
}
// Consultar un usuario
try (Session session = HibernateUtil.getSessionFactory().openSession()) {
Usuario usuarioConsultado = session.find(Usuario.class, usuarioId);
if (usuarioConsultado == null) {
System.out.println("Usuario con id " + usuarioId + " no encontrado.");
} else {
System.out.println("Usuario: " + usuarioConsultado.getNombre());
}
}
// Actualizar un usuario
try (Session session = HibernateUtil.getSessionFactory().openSession()) {
Transaction tx = session.beginTransaction();
Usuario usuarioActualizado = session.find(Usuario.class, usuarioId);
if (usuarioActualizado != null) {
usuarioActualizado.setNombre("Juan Actualizado");
session.merge(usuarioActualizado);
} else {
System.out.println("No se puede actualizar: usuario con id " + usuarioId + " no existe.");
}
tx.commit();
}
// Eliminar un usuario
try (Session session = HibernateUtil.getSessionFactory().openSession()) {
Transaction tx = session.beginTransaction();
Usuario usuarioEliminar = session.find(Usuario.class, usuarioId);
if (usuarioEliminar != null) {
session.remove(usuarioEliminar);
} else {
System.out.println("No se puede eliminar: usuario con id " + usuarioId + " no existe.");
}
tx.commit();
}
// Cerrar la SessionFactory
HibernateUtil.shutdown();
}
}
Ubicación del archivo: ./src/main/java/com/example/Main.java
6. Estructura del Proyecto
hibernate-example/
├── pom.xml
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ ├── Usuario.java
│ │ │ ├── HibernateUtil.java
│ │ │ └── Main.java
│ │ ├── resources/
│ │ │ └── hibernate.cfg.xml
8. Recursos
Hibernate
DBeaver
- Herramienta universal de gestión de bases de datos (gratuita y open-source para SQL/NoSQL).
- Documentación oficial: Guía de usuario y tutoriales
- Descarga: Versión Community
Aiven
- Plataforma gestionada open-source para datos en la nube (streaming, almacenamiento y análisis con Kafka, PostgreSQL, etc.).
- Documentación oficial: Guías completas y API
- Sitio principal: Explora servicios