Skip to content

Fix: unificar created_at/updated_at a @CreationTimestamp/@UpdateTimestamp en todas las entidades

belen.varsi requested to merge pft/fix/timestamps-hibernate-consistente into master

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ía updated_at con updatable=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): el INSERT generado por
    Hibernate ahora incluye created_at/updated_at explícitamente en
    usuarios e inst_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.

Merge request reports

Loading