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.
| Concepto | Cuándo usarlo / Explicación | Ejemplo |
|---|---|---|
@Entity | Siempre que la clase represente una tabla en la base de datos. | @Entity public class Producto { ... } |
@Id | Obligatorio en toda entidad para marcar la clave primaria. | @Id private Integer id; |
@GeneratedValue | Cuando 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).
| Concepto | Cuándo usarlo | Ejemplo |
|---|---|---|
@ManyToOne(optional = false) | Muchos objetos pertenecen a uno solo. Relación obligatoria. | @ManyToOne(optional = false) private Usuario usuario; |
@ManyToOne | Relación opcional (permite valores nulos). | @ManyToOne private Message responseTo; |
@OneToMany | Una 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; |
@ManyToMany | Relació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.
- 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ón | Propósito |
|---|---|
@NotBlank | Obliga 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. |
@Email | Valida 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 / @Max | Para números enteros: define rangos numéricos. |
@Positive / @PositiveOrZero | Asegura 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 Java | Anotaciones Típicas | Uso Común |
|---|---|---|
String | @NotBlank, @Size, @Email, @Column(length) | Nombres, emails, descripciones. |
Integer / Long | @Min, @Max, @Positive, @NotNull | IDs, cantidades, puntos. |
Double / BigDecimal | @DecimalMin, @Positive, @NotNull | Precios, importes financieros. |
Date / LocalDateTime | @Past, @Future, @NotNull | Fechas 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, @ManyToMany | Colecciones relacionadas. |
Enum | @Enumerated(EnumType.STRING) | Categorías o estados fijos. |