Dominando Entidades JPA: Mapeo y Validaciones de Datos

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 28,35 KB

1. Programación de una Entidad JPA

A continuación se presenta un ejemplo básico de cómo estructurar una clase de entidad utilizando las anotaciones estándar de JPA:


@Entity
public class NuevaEntidad {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(nullable = false)
    private String campo;

    @ManyToOne(optional = false)
    private OtraEntidad otraEntidad;
}

Configuración de la Clave Primaria

En el contexto de persistencia, el identificador único es fundamental. Si el requerimiento especifica un identificador único o una clave primaria autoincremental, se deben considerar los siguientes puntos:

  • @Id: Define la clave primaria de la entidad.
  • @GeneratedValue(strategy = GenerationType.AUTO): Indica que el valor se genera automáticamente.
  • Integer: Es el tipo de dato comúnmente utilizado para identificadores en entornos educativos y profesionales.
ConceptoCuándo usarlo / ExplicaciónEjemplo
@EntitySiempre que la clase represente una tabla en la base de datos.@Entity public class Producto { ... }
@IdObligatorio en toda entidad para marcar la clave primaria.@Id private Integer id;
@GeneratedValueCuando el identificador debe ser autoincremental o generado por el sistema.@GeneratedValue(strategy = GenerationType.AUTO)

Personalización de Columnas (@Column)

Estas anotaciones tienen un impacto directo en la estructura de la base de datos (DB):

@Column(nullable = false)Se usa cuando el enunciado indica que el campo es obligatorio a nivel de base de datos.
@Column(length = X)Limita el tamaño máximo de una cadena de caracteres en la base de datos.
@Column(unique = true)Garantiza que no se repitan valores en esa columna específica.
@Column(columnDefinition = "LONGBLOB")Fuerza un tipo de dato específico en el motor de base de datos (ej. para archivos binarios).

Relaciones entre Entidades

El manejo de relaciones es clave para un modelo de datos robusto. Aquí se detallan las configuraciones más comunes:

Relaciones con Columna de Unión


@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "region_id")
private List<Advertisement> advertisements;

Si el enunciado indica que una relación es obligatoria, se utiliza @ManyToOne(optional = false).

ConceptoCuándo usarloEjemplo
@ManyToOne(optional = false)Muchos objetos pertenecen a uno solo. Relación obligatoria.@ManyToOne(optional = false) private Usuario usuario;
@ManyToOneRelación opcional (permite valores nulos).@ManyToOne private Message responseTo;
@OneToManyUna entidad posee una colección de elementos relacionados.@OneToMany private List<Comentario> comentarios;
@OneToOne(optional = false)Relación uno a uno de carácter obligatorio.@OneToOne(optional = false) private Compra compra;
@ManyToManyRelación de muchos a muchos (ej. etiquetas, seguidores).@ManyToMany private List<Usuario> following;

Configuraciones Avanzadas de Relación

  • fetch = FetchType.LAZY: Indica que la relación no se cargue inmediatamente, optimizando el rendimiento.

2cG2AYVDQAAAABJRU5ErkJggg==

  • cascade = CascadeType.ALL: Se usa cuando los objetos hijos dependen totalmente del ciclo de vida del padre.
  • orphanRemoval = true: Si un hijo se elimina de la colección del padre, se borra automáticamente de la base de datos.
  • mappedBy = "...": Define el lado inverso de la relación, indicando qué atributo en la otra entidad es el propietario.

Validaciones en la Aplicación (Bean Validation)

A diferencia de @Column, estas anotaciones validan los datos dentro de la aplicación antes de intentar persistirlos:

AnotaciónPropósito
@NotBlankObliga al usuario a rellenar un texto (no vacío ni solo espacios).
@Size(max = X)Limita la longitud máxima de caracteres permitidos en la interfaz.
@EmailValida que el texto cumpla con un formato de correo electrónico válido.
@DecimalMin("0.0")Para números decimales: define un valor mínimo permitido.
@Min / @MaxPara números enteros: define rangos numéricos.
@Positive / @PositiveOrZeroAsegura que el valor sea mayor que cero o mayor/igual a cero.

Manejo de Objetos Grandes (@Lob)

La anotación @Lob marca un campo como un objeto grande (Large Object), ideal para:

  • Texto extenso: Descripciones largas o contenido de artículos.
  • Binarios: Imágenes, documentos o archivos almacenados directamente en la DB.

@Lob
private byte[] imagenDatos;

@Lob
private String contenido;

Resumen de Tipos de Datos y Anotaciones

Tipo JavaAnotaciones TípicasUso Común
String@NotBlank, @Size, @Email, @Column(length)Nombres, emails, descripciones.
Integer / Long@Min, @Max, @Positive, @NotNullIDs, cantidades, puntos.
Double / BigDecimal@DecimalMin, @Positive, @NotNullPrecios, importes financieros.
Date / LocalDateTime@Past, @Future, @NotNullFechas de creación, timestamps.
boolean / Boolean@NotNull (si es Boolean)Estados (activo, publicado).
byte[]@Lob, @Column(columnDefinition = "LONGBLOB")Imágenes o ficheros.
List<Entidad>@OneToMany, @ManyToManyColecciones relacionadas.
Enum@Enumerated(EnumType.STRING)Categorías o estados fijos.

Entradas relacionadas: