Modelar entidades con JPA en Spring Boot

Clase 17 de 31Curso de Java: Backend con Spring Boot

Contenido del curso

JPA con Spring y Spring Data

Resumen

Trabajar con bases de datos relacionales en Java requiere un enfoque sólido para representar tablas como objetos. JPA (Java Persistence API) es el estándar de la industria que permite modelar, acceder, conservar y administrar datos entre clases Java y tablas de una base de datos relacional. Aquí se explica paso a paso cómo crear entidades, definir columnas y establecer relaciones entre ellas dentro de un proyecto Spring Boot.

¿Qué es JPA y por qué no es lo mismo que Hibernate?

JPA es una especificación, no una implementación concreta [0:25]. Define las reglas y anotaciones para mapear objetos Java a tablas relacionales. Hibernate es una de las implementaciones más populares de JPA, pero existen otras como Eclipse Link. Esta distinción es importante: JPA establece el contrato y Hibernate lo ejecuta.

Para utilizar JPA en un proyecto Spring Boot, se añade la dependencia spring-boot-starter-data-jpa en el archivo pom.xml [1:17]. Maven se encarga de resolver, descargar y autoconfigurar las librerías necesarias.

¿Cómo se crea y configura una entidad en JPA?

Dentro del proyecto se crea un paquete llamado entity donde vivirán las clases que representan tablas [1:49]. Cada entidad se anota con @Entity y @Table.

¿Qué anotaciones necesita la entidad Post?

La clase Post se marca con @Entity y @Table(name = "post") [2:05]. Toda entidad requiere un identificador único:

java @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id_post", nullable = false, unique = true) private Long id;

  • @Id indica la clave primaria.
  • @GeneratedValue con estrategia IDENTITY genera un valor único automáticamente [2:25].
  • @Column permite personalizar el nombre de la columna, definir si acepta nulos y si el valor debe ser único [2:47].

Se agrega también una columna de descripción con un largo máximo de 255 caracteres [3:08]:

java @Column(length = 255) private String description;

¿Cómo se define la entidad User?

La clase User sigue la misma estructura base [3:37]. Incluye las propiedades name, email y birthDate:

java @Column(length = 50) private String name;

@Column(length = 50) private String email;

@Column private LocalDate birthDate;

El campo birthDate usa LocalDate de Java 8, por lo que no requiere un atributo length [4:17]. El identificador se configura con @GeneratedValue(strategy = GenerationType.AUTO) para que se auto incremente con cada nuevo registro [3:55].

¿Cómo se establecen relaciones entre entidades?

La relación entre User y Post es bidireccional [5:42]. Un usuario puede tener muchos posts, y cada post pertenece a un solo usuario.

En la entidad Post se utiliza @ManyToOne [3:20]:

java @ManyToOne private User user;

En la entidad User se utiliza @OneToMany [4:40]:

java @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JsonManagedReference private List<Post> posts = new ArrayList<>();

  • mappedBy indica qué propiedad en la entidad Post representa la relación.
  • CascadeType.ALL propaga todas las operaciones (guardar, eliminar, actualizar) a los posts asociados.
  • FetchType.EAGER carga los posts del usuario de forma inmediata al consultar.
  • @JsonManagedReference evita errores de StackOverflow por referencia circular al exponer los datos en un servicio REST [5:15].

Finalmente, ambas entidades necesitan un constructor vacío (requerido por JPA), un constructor con parámetros, métodos getter y setter, y el método toString [5:27].

Con estas bases listas, el siguiente paso natural es configurar el data source para conectar la aplicación con la base de datos. Si tienes dudas sobre las relaciones o las anotaciones, comparte tu experiencia en los comentarios.