// JpaAuditConfig.java package com.imprimelibros.erp.config; import java.util.Optional; import jakarta.persistence.EntityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.domain.AuditorAware; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.security.core.context.SecurityContextHolder; import com.imprimelibros.erp.users.User; import com.imprimelibros.erp.users.UserDetailsImpl; // tu implementación @Configuration @EnableJpaAuditing(auditorAwareRef = "auditorAware") public class JpaAuditConfig { @Bean public AuditorAware auditorAware(EntityManager em) { return () -> { var ctx = SecurityContextHolder.getContext(); if (ctx == null) return Optional.empty(); var auth = ctx.getAuthentication(); if (auth == null || !auth.isAuthenticated()) return Optional.empty(); Object principal = auth.getPrincipal(); Long userId = null; // Tu UserDetailsImpl ya tiene el id if (principal instanceof UserDetailsImpl udi) { userId = udi.getId(); } // Si a veces pones el propio User como principal: else if (principal instanceof User u && u.getId() != null) { userId = u.getId(); } // ⚠️ NO hagas consultas aquí (nada de userDao.findBy...). if (userId == null) return Optional.empty(); // Devuelve una referencia gestionada (NO hace SELECT ni fuerza flush) return Optional.of(em.getReference(User.class, userId)); }; } }