Repaso
English

¿Qué es el persistence context y qué es el "dirty checking"?

Opciones

  1. Un archivo de log donde la base de datos registra sus cambios
  2. Una caché de entidades por transacción; los cambios se guardan en el commit (Opción correcta)
  3. Una función de seguridad que limita quién puede leer una entidad
  4. Una forma de copiar tablas de una base de datos a otra

Respuesta

Una caché por transacción de entidades gestionadas; en el commit, JPA las compara con su estado original y lanza automáticamente los UPDATE de las que cambiaron, aunque no llames a save

Por qué

Cuando cargas una entidad dentro de una transacción, JPA la mantiene en un persistence context (caché de primer nivel) y recuerda sus valores originales. Esa entidad está "managed".

Si llamas a un setter sobre una entidad managed, en el flush o commit JPA detecta la diferencia (dirty checking) y ejecuta el UPDATE por sí mismo. Así que dentro de un método @Transactional, user.setName("x") es suficiente; no hace falta save().

Además, el mismo findById dos veces en una transacción devuelve el mismo objeto sin volver a consultar la base de datos.

Recuerda

Las entidades managed se guardan solas en el commit si cambiaron.

Términos clave

Practica esta pregunta en Repaso