Saltar a contenido

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

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