¿Qué es el persistence context y qué es el "dirty checking"?
Opciones
- Un archivo de log donde la base de datos registra sus cambios
- Una caché de entidades por transacción; los cambios se guardan en el commit (Opción correcta)
- Una función de seguridad que limita quién puede leer una entidad
- 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.