Gestión de Relaciones en JPA: Lazy vs Eager Fetching
Clase 10 de 25 • Curso de Java Spring Data JPA: Bases de Datos
Contenido del curso
Primeros pasos
Spring Data Repositories
- 7

Uso de Spring Data Repositories para Gestión de Datos
08:39 min - 8

Guardar y Actualizar Registros con Spring Data Repositories
08:34 min - 9

Eliminar elementos con Spring Data JPA: método deleteById
05:36 min - 10

Gestión de Relaciones en JPA: Lazy vs Eager Fetching
Viendo ahora - 11

Query Methods en Spring para Consultas Personalizadas
08:28 min - 12

Filtrado de Pizzas por Ingredientes usando Query Methods
07:27 min - 13

Consultas Avanzadas con Query Methods en Java Spring
11:25 min - 14

Uso de Query Methods para Filtrar y Ordenar Datos en Spring
09:30 min - 15

Paginación y Ordenación con Spring Data Repositories
07:39 min - 16

Ordenamiento Dinámico con Paging and Sorting Repository
07:58 min
Personalización de queries
- 17

Consultas de Base de Datos con JPQL en Spring Boot
08:01 min - 18

Consultas SQL nativas y ordenación con Hibernate en Spring Data
08:26 min - 19

Uso de Proyecciones en Queries Personalizados con Java y SQL
13:47 min - 20

Actualización de Precios de Pizza con Spring Data JPA
11:50 min - 21

Propiedades ACID y Spring Data: Uso de @Transactional
10:07 min
Características avanzadas
Próximos pasos
¿Cómo gestionar las relaciones entre entidades en una base de datos?
Al crear aplicaciones complejas, frecuentemente las entidades en una base de datos comparten relaciones. Estas pueden ser de uno a uno (1:1), muchos a uno (M:1) o uno a muchos (1:M), entre otras. Es vital entender cómo recuperar dichas relaciones, dado que un mal manejo puede afectar severamente el rendimiento de una aplicación. Un manejo eficiente permite evitar accesos innecesarios o sobrecarga de datos.
¿Cómo crear y configurar un repositorio para las órdenes?
Primero, deberemos crear un nuevo repositorio para manejar las órdenes. Para esto, seguiremos los pasos a continuación:
-
Crear la interfaz OrderRepository:
- Extender de
JpaRepository. - Usar
OrderEntitycomo la entidad yIntegercomo tipo de clave primaria.
- Extender de
-
Agregar anotaciones necesarias:
- Incluir
@Getter,@Settery@NoArgsConstructoren nuestras entidades Java para evitar problemas de serialización JSON.
- Incluir
Esta configuración inicial nos proporcionará acceso a métodos predeterminados para gestionar las órdenes sin tener que escribir código adicional.
¿Cómo usar los servicios REST para exponer datos?
A continuación, implementaremos el servicio y el controlador:
-
Crear el servicio OrderService:
- Anotarlo con
@Service. - Inyectar el repositorio en el constructor (uso de
finalpara asegurar la inyección por constructor). - Crear un método para recuperar todas las órdenes usando
findAll().
- Anotarlo con
-
Crear el controlador OrderController:
- Utilizar
@RestController. - Atender peticiones en
API/orderscon@GetMapping. - Retornar una respuesta
OKcon la lista de órdenes.
- Utilizar
¿Cómo solucionar problemas de serialización con JSON?
Un problema común al serializar entidades es el ciclo infinito causado por relaciones bidireccionales entre entidades, como ocurrió con OrderEntity y OrderItemEntity. Esto sucede cuando cada entidad intenta cargar los datos de la otra recursivamente. Para resolverlo, podemos:
- Anotar las propiedades de las entidades con
@JsonIgnorepara evitar que ciertas relaciones sean serializadas.
¿Cuándo usar Lazy y Eager en las relaciones?
Las propiedades de FetchType determinan cómo se recuperan las relaciones:
- Lazy: Retrasa la carga de datos hasta que sean específicamente solicitados. Es útil cuando no necesitamos la relación inmediatamente.
- Eager: Carga la relación al mismo tiempo que la entidad principal. Usada cuando la relación es vital para el funcionamiento de la operación actual.
Ejemplo de configuración:
- Usar
@ManyToOne(fetch = FetchType.LAZY)para relaciones como cliente en una orden, donde no siempre es necesario cargar la información del cliente. - Usar
@OneToMany(fetch = FetchType.EAGER)para ítems de una orden, si estos son cruciales para procesar cada orden.
¿Cómo optimizar la recuperación de relaciones?
De manera predeterminada, JPA y Hibernate gestionan las siguientes configuraciones por tipo de relación:
- OneToMany y ManyToMany: Por defecto son Lazy.
- ManyToOne y OneToOne: Por defecto son Eager.
Recomendaciones generales:
- Limitar la carga de relaciones a solo las necesarias.
- Configurar relaciones cómo Lazy siempre que sea posible para mejorar el rendimiento.
- Si una relación es ampliamente usada, considerar marcarla como Eager.
Con una comprensión clara sobre cómo y cuándo aplicar Lazy o Eager, así como gestionar adecuadamente las relaciones entre entidades, estarás equipado para optimizar el rendimiento y funcionamiento de tu aplicación. ¡Sigue aprendiendo y perfeccionando estos conceptos en tus proyectos!