Enums en Hibernate

Básico
Hibernate
Hibernate
Hoy: 15/10/2025

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.

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en Hibernate

Documentación oficial de Hibernate
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Hibernate es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Hibernate

Explora más contenido relacionado con Hibernate y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes 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.

Cursos que incluyen esta lección

Esta lección forma parte de los siguientes cursos estructurados con rutas de aprendizaje