Construyendo una Entity

Las anotaciones @Entity y @Table nos dejan definir las entidades en JPA a partir de un modelo JavaBean que hayamos creado. Podemos usarlo para crear una entidad y pedirle a nuestro proveedor de JPA que las almacene dentro de una tabla concreta. Dentro de esa tabla puede haber columnas, declaradas mediante la anotación @Entity. Además, no debemos olvidar el uso de @Id para declarar un identificador.

Este curso ha sido marcado como anticuado y no está siendo revisado de forma activa. Es posible que la información pueda estar desactualizada o que los enlaces se hayan roto.

Para crear una entidad JPA en Java que nos permita almacenar datos en una base de datos, lo primero que debemos hacer es definir una clase que represente nuestro modelo de datos. En este caso, vamos a crear una clase llamada Empleado, que contendrá campos básicos como un código de empleado, apellidos, nombre y fecha de nacimiento. Estos campos serán los atributos que queremos persistir.

Al definir esta clase, es importante importar las clases necesarias, como java.util.Date para la fecha de nacimiento, y tener en cuenta que JPA y Hibernate manejan internamente la conversión de tipos comunes de Java a los tipos adecuados en la base de datos. Por ejemplo, saben cómo trabajar con cadenas, números, fechas e incluso arrays de bytes, aunque para colecciones más complejas o relaciones entre entidades necesitaremos anotaciones adicionales.

Un aspecto fundamental para que Hibernate funcione correctamente es que nuestra entidad tenga un constructor vacío. Esto es necesario porque el framework utiliza este constructor para crear instancias de la entidad cuando recupera datos de la base. Además, por comodidad y para facilitar la creación de objetos, podemos añadir constructores que reciban parámetros para inicializar los campos directamente.

También debemos implementar los métodos getter y setter para cada uno de los campos, ya que JPA los utiliza para acceder y modificar los valores de la entidad. Un método toString puede ser útil para imprimir rápidamente la información de un empleado durante pruebas o depuración.

Aunque no siempre es obligatorio, es recomendable que nuestra entidad implemente la interfaz Serializable. Esto es especialmente importante si la entidad va a ser transmitida de forma remota o almacenada en sesiones, evitando problemas relacionados con la serialización. Al implementar esta interfaz, debemos definir un identificador de versión serialVersionUID.

Para que JPA reconozca nuestra clase como una entidad, debemos anotarla con @Entity del paquete javax.persistence. Es importante usar las anotaciones estándar de JPA y no las específicas de un proveedor como Hibernate, para mantener la portabilidad del código.

Luego, para indicar cómo se mapea esta entidad a la base de datos, usamos la anotación @Table, también de javax.persistence. Podemos dejar que JPA asigne un nombre por defecto a la tabla o especificar uno explícitamente con el atributo name. Por ejemplo, podemos indicar que la tabla se llame empleado o table_empleado.

Cada campo que queremos persistir debe estar anotado con @Column, donde podemos definir detalles como el nombre de la columna, la longitud para cadenas de texto, la precisión para números decimales o si el valor debe ser único. Esto nos permite controlar cómo se crean las columnas en la base de datos y aplicar restricciones.

Un requisito indispensable es que toda entidad tenga un identificador único, que se marca con la anotación @Id. En nuestro ejemplo, el campo codigo será el identificador. Esto es crucial para que JPA pueda distinguir cada registro y realizar operaciones como búsquedas o actualizaciones. Más adelante, podemos configurar la generación automática de estos identificadores para que se asignen secuencialmente o mediante otras estrategias, pero por ahora basta con declararlo.

Con estos pasos, ya tenemos nuestra entidad Empleado lista para ser utilizada con JPA y Hibernate, pudiendo crear, guardar y recuperar objetos de la base de datos de forma sencilla y estructurada.

Un ejemplo básico de cómo quedaría esta clase es el siguiente:

package com.ejemplo.modelo;

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.Column;
import java.io.Serializable;
import java.util.Date;

@Entity
@Table(name = "empleado")
public class Empleado implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "codigo")
    private Long codigo;

    @Column(name = "apellidos", length = 50)
    private String apellidos;

    @Column(name = "nombre", length = 50)
    private String nombre;

    @Column(name = "fecha_nacimiento")
    private Date fechaNacimiento;

    public Empleado() {
        // Constructor vacío necesario para JPA
    }

    public Empleado(Long codigo, String apellidos, String nombre, Date fechaNacimiento) {
        this.codigo = codigo;
        this.apellidos = apellidos;
        this.nombre = nombre;
        this.fechaNacimiento = fechaNacimiento;
    }

    public Long getCodigo() {
        return codigo;
    }

    public void setCodigo(Long codigo) {
        this.codigo = codigo;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    @Override
    public String toString() {
        return "Empleado{" +
                "codigo=" + codigo +
                ", apellidos='" + apellidos + '\'' +
                ", nombre='" + nombre + '\'' +
                ", fechaNacimiento=" + fechaNacimiento +
                '}';
    }
}

Con esta estructura, ya podemos empezar a trabajar con nuestra entidad, persistiendo objetos Empleado en la base de datos y realizando consultas. Más adelante, veremos cómo configurar la generación automática de identificadores y cómo interactuar con el sistema de persistencia para guardar y recuperar datos.

Lista de reproducción
  1. 1
    La persistencia es clave
    6 minutos
  2. 2
    Instalando Hibernate
    8 minutos
  3. 3
    Crear el persistence.xml
    9 minutos
  4. 4
    Construyendo una Entity
    8 minutos
  5. 5
    Accediendo al EntityManager
    9 minutos
  6. 6
    Insertando con persist
    7 minutos
  7. 7
    Managed Entities
    6 minutos
  8. 8
    Merge y remove
    5 minutos
  9. 9
    Inciso sobre Java 8
    7 minutos
  10. 10
    Introducción a relaciones
    6 minutos
  11. 11
    Relación OneToOne
    11 minutos
  12. 12
    OneToOne inverso con mappedBy
    8 minutos
  13. 13
    OneToMany: planteamiento
    6 minutos
  14. 14
    OneToMany: anotaciones
    6 minutos
  15. 15
    OneToMany: EntityManager
    7 minutos
  16. 16
    ¡AYUDA! Error Lazy Initialization (OneToMany)
    5 minutos
  17. 17
    ¡AYUDA! No se fijan las relaciones (OneToMany)
    8 minutos
  18. 18
    Borrar hijos en un OneToMany
    11 minutos
  19. 19
    ON DELETE SET NULL
    8 minutos