Hibernate

Hibernate

Tutorial Hibernate: Enums en Hibernate

Hibernate enums: enumeraciones y uso. Domina el uso de enumeraciones en Hibernate mediante ejemplos prácticos y detallados.

Introducción

En Hibernate, los enums son un recurso valioso para modelar atributos que representan un conjunto fijo de constantes, como estados, categorías, y roles, entre otros. Hibernate permite mapear enums a columnas en la base de datos de una manera eficiente y segura respecto a tipos, mediante la etiqueta @Enumerated. Existen principalmente dos estrategias para mapear un enum: mediante su nombre (EnumType.STRING) o mediante su ordinal (EnumType.ORDINAL).

Mapeo de enum utilizando el nombre (EnumType.STRING)

Esta estrategia mapea el enum a una columna de base de datos almacenando el nombre de las constantes del enum. Es la opción recomendada porque hace que la base de datos sea más legible y el código sea más resistente a cambios en el orden de las constantes en el enum.

import jakarta.persistence.*;

@Entity
public class Tarea {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String descripcion;
    
    @Enumerated(EnumType.STRING)
    private EstadoTarea estado;

    // Getters y setters
}

enum EstadoTarea {
    PENDIENTE,
    EN_PROGRESO,
    COMPLETADA
}

En este ejemplo, el atributo estado de la clase Tarea es un enum que representa el estado de una tarea. Al usar @Enumerated(EnumType.STRING), Hibernate mapeará este campo a una columna de texto en la base de datos, guardando los valores como “PENDIENTE”, “EN_PROGRESO”, o “COMPLETADA”.

  • Ventaja: La legibilidad y mantenibilidad son las principales ventajas, ya que los nombres de las constantes suelen ser autoexplicativos y el impacto de cambiar el orden o insertar nuevas constantes es mínimo.
  • Desventaja: El uso de cadenas puede resultar en un mayor consumo de espacio en la base de datos comparado con los valores enteros.

Mapeo de enum utilizando el ordinal (EnumType.ORDINAL)

Es la estrategia predeterminada .Esta estrategia mapea el enum a una columna de base de datos almacenando la posición ordinal de las constantes del enum (comenzando en 0). Aunque esta opción puede ser más eficiente en términos de almacenamiento, es menos legible y puede causar problemas si el orden de las constantes en el enum cambia.

import jakarta.persistence.*;

@Entity
public class Producto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String nombre;
    
    @Enumerated(EnumType.ORDINAL)
    private CategoriaProducto categoria;

    // Getters y setters
}

enum CategoriaProducto {
    ELECTRONICA,
    ROPA,
    ALIMENTOS
}

En este ejemplo, el atributo categoria de la clase Producto es un enum que representa la categoría de un producto. Utilizando @Enumerated(EnumType.ORDINAL), Hibernate mapeará este campo a una columna numérica en la base de datos, almacenando los valores como 0 para ELECTRONICA, 1 para ROPA, y 2 para ALIMENTOS.

  • Ventaja: El principal beneficio es la eficiencia en el almacenamiento, ya que los números enteros ocupan menos espacio que las cadenas.
  • Desventaja: El principal inconveniente es la falta de claridad en la base de datos (ver números en lugar de nombres significativos) y el problema de mantenimiento si el orden de las constantes en el enum cambia o si se insertan nuevas constantes entre las existentes, lo que puede llevar a inconsistencias de datos.

Consideraciones adicionales

Es importante tener en cuenta que el uso de EnumType.ORDINAL puede llevar a errores si se modifican los enums añadiendo, eliminando o reordenando constantes. Por lo tanto, se recomienda utilizar EnumType.STRING para una mayor flexibilidad y mantenibilidad del código.

Además, es posible personalizar aún más el mapeo de enums utilizando la anotación @jakarta.persistence.AttributeConverter, lo cual permite definir una lógica de conversión específica entre la representación del enum en la aplicación y la columna correspondiente en la base de datos.

Certifícate en Hibernate con CertiDevs PLUS

Ejercicios de esta lección Enums en Hibernate

Evalúa tus conocimientos de esta lección Enums en Hibernate con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Consultas JPQL avanzadas

Hibernate
Código

Configuración con JPA

Hibernate
Test

Tipos de datos personalizados

Hibernate
Puzzle

Consultas Criteria avanzadas

Hibernate
Código

Operaciones en cascada

Hibernate
Test

Anotaciones JPA

Hibernate
Puzzle

Asociación Many To One

Hibernate
Test

Funciones en consultas JPQL

Hibernate
Código

Asociación Many To Many entre Actor y Pelicula

Hibernate
Código

Asociación One To Many entre Curso y Estudiante

Hibernate
Código

Tipos de datos básicos

Hibernate
Test

Consultas Criteria básicas

Hibernate
Código

Asociación Many To Many

Hibernate
Puzzle

CRUD de entidades con asociaciones

Hibernate
Proyecto

Optimización de asociaciones con carga lazy

Hibernate
Código

Asociación One To Many

Hibernate
Puzzle

Configuración con Maven

Hibernate
Test

Asociación One To One

Hibernate
Test

CRUD en Hibernate

Hibernate
Código

Operaciones en cascada

Hibernate
Puzzle

Introducción a Hibernate

Hibernate
Test

Atributos de tipo enum en entidades JPA

Hibernate
Código

Carga de asociaciones en consultas con EntityGraph

Hibernate
Código

Configuración con Gradle

Hibernate
Test

Asociación One To One entre Libro y Resumen

Hibernate
Código

Asociación One To Many

Hibernate
Test

Asociación Many To Many

Hibernate
Test

Creación de entidades

Hibernate
Test

Ciclo de vida de una entidad

Hibernate
Código

Consultas JPQL básicas

Hibernate
Código

Carga de asociaciones en consultas con EntityGraph y anotaciones

Hibernate
Código

Tipos de datos embebidos

Hibernate
Código

Asociación Many To One entre Paciente y Clinica

Hibernate
Código

Asociación Many To One

Hibernate
Puzzle

Optimización de consultas con DTOs

Hibernate
Código

Atributos @Transient en entidades

Hibernate
Código

Asociación One To One

Hibernate
Puzzle

Todas las lecciones de Hibernate

Accede a todas las lecciones de Hibernate y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Hibernate

Hibernate

Introducción Y Entorno

Configuración Hibernate Con Gradle

Hibernate

Introducción Y Entorno

Configuración Hibernate Con Maven

Hibernate

Introducción Y Entorno

Configuración Hibernate Con Jpa

Hibernate

Introducción Y Entorno

Creación De Entidades Jpa

Hibernate

Entidades Jpa Y Tipos De Datos

Tipos De Datos En Hibernate

Hibernate

Entidades Jpa Y Tipos De Datos

Atributos @Transient En Entidades

Hibernate

Entidades Jpa Y Tipos De Datos

Enums En Hibernate

Hibernate

Entidades Jpa Y Tipos De Datos

Tipos De Datos Embebidos

Hibernate

Entidades Jpa Y Tipos De Datos

Crud En Hibernate

Hibernate

Entidades Jpa Y Tipos De Datos

Ciclo De Vida De Una Entidad

Hibernate

Entidades Jpa Y Tipos De Datos

Asociación One To One

Hibernate

Asociaciones Entre Entidades

Asociación One To Many

Hibernate

Asociaciones Entre Entidades

Asociación Many To One

Hibernate

Asociaciones Entre Entidades

Asociación Many To Many

Hibernate

Asociaciones Entre Entidades

Operaciones En Cascada

Hibernate

Asociaciones Entre Entidades

Consultas Jpql Básicas

Hibernate

Consultas Hql Y Jpql

Consultas Jpql Avanzadas

Hibernate

Consultas Hql Y Jpql

Funciones En Consultas Jpql

Hibernate

Consultas Hql Y Jpql

Consultas Criteria Básicas

Hibernate

Api Criteria De Jpa

Consultas Criteria Avanzadas

Hibernate

Api Criteria De Jpa

Carga De Asociaciones En Consultas Con Entitygraph

Hibernate

Api Entitygraph

Carga De Asociaciones En Consultas Con Entitygraph Y Anotaciones

Hibernate

Api Entitygraph

Optimización De Consultas Con Dtos

Hibernate

Optimización

Optimización De Asociaciones Con Carga Lazy

Hibernate

Optimización

Certificados de superación de Hibernate

Supera todos los ejercicios de programación del curso de Hibernate y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender la importancia de los enums para modelar atributos con un conjunto fijo de constantes en Hibernate.
  • Aprender a mapear enums en Hibernate utilizando la etiqueta @Enumerated.
  • Diferenciar entre las dos estrategias de mapeo de enums: por nombre (EnumType.STRING) y por ordinal (EnumType.ORDINAL).
  • Entender por qué mapear enums por nombre es generalmente la opción recomendada.