¿Cuáles son los errores más comunes con JPA/Hibernate y @Transactional?
Respuesta
- Consultas N+1: colecciones LAZY recorridas en un bucle; se soluciona con
join fetch, @EntityGraph, batch size o proyecciones a DTO. LazyInitializationException: leer un campo lazy fuera de la transacción; trae lo necesario dentro del servicio o usa DTOs.- Self-invocation o métodos privados: se salta el proxy, así que no hay transacción.
- Las excepciones checked no hacen rollback por defecto (
rollbackFor). - Transacciones demasiado largas (con llamadas a servicios HTTP lentos dentro) retienen conexiones de la base de datos.
- Devolver entidades directamente desde los controladores: filtra campos y dispara lazy loading.
open-in-view (true por defecto en Boot) oculta problemas de lazy loading en la capa web; muchos equipos lo desactivan.
Practica esta pregunta en Repaso