Fix: unificar created_at/updated_at a @CreationTimestamp/@UpdateTimestamp en todas las entidades
Qué
Corrige el hallazgo #4 (Alto) de la auditoría de backend (2026-08-27):
mecanismo mixto para gestionar created_at/updated_at entre entidades.
Por qué
Grupo, InformeAdjunto y Telefono usaban @CreationTimestamp/
@UpdateTimestamp (Hibernate gestiona el valor). El resto — Usuario,
Instancia, Recordatorio, Frecuencia, CategoriaInstancia,
CategoriaRecordatorio, Involucrado, RolPermiso, ItrCarrera,
Carrera, Itr — usaba insertable=false confiando exclusivamente en
el trigger actualizar_updated_at() de Postgres.
Ambos mecanismos funcionan hoy porque el trigger sobreescribe lo que
mande Hibernate en el UPDATE. El problema es la dependencia implícita
no documentada del segundo grupo: si el trigger se desactiva alguna vez
(migración, un entorno que no lo replica), esas entidades dejan de
actualizar updated_at silenciosamente, sin ningún error que lo
delate.
Por qué converger hacia Hibernate y no al revés
-
Cero migración de schema: los triggers y columnas ya existen tal
cual para las 11 entidades — solo cambia la anotación Java. -
Resuelve la fragilidad real, no solo la inconsistencia cosmética:
ahora Hibernate provee su propio valor como red de seguridad, sin
depender 100% de que el trigger esté presente y replicado en todos
los entornos (local, CI, un futuro entorno de staging, etc.).
Alcance ampliado respecto a la auditoría
De paso se corrigen dos casos que tenían la misma dependencia del
trigger pero no estaban en la lista original de la auditoría:
-
ComentarioBase(base de las 4 entidades de comentarios: Normal/
Confidencial × Estudiante/Instancia). -
Funcionario, que además teníaupdated_atconupdatable=false—
Hibernate no lo tocaba ni siquiera al editar un funcionario. -
Testing
-
Suite completa: 516 tests, 0 failures.
-
Verificado contra Postgres real (perfil
integration,
ComentarioConfidencialInstanciaIT): elINSERTgenerado por
Hibernate ahora incluyecreated_at/updated_atexplícitamente en
usuarioseinst_com_confidenciales, sin errores de constraint —
confirma que el cambio de anotación no rompe la validación de schema
(ddl-auto=validate) ni la inserción real.
Qué no cambia
Ninguna migración de base de datos. Las columnas, triggers y el schema
(proyecto_schema.sql) quedan exactamente iguales — el cambio es
puramente a nivel de anotaciones JPA en las entidades.