Dirty checking
Cuando pasa un objeto al estado attached (se obtiene con get, con un query, o se guarda), los cambios posteriores que se realicen sobre el objeto son vistos por hibernate y los actualiza por automático hacia la base de datos al hacer flush/cerrar la sesión y sin necesidad de ejecutar explicitamente save()
, este concepto es llamado dirty checking.
Por ejemplo, el siguiente código hace que se guarde el título al revés en la bd:
def b = Book.findByAuthor(params.author)
b.title = b.title.reverse()
Sin embargo se recomienda siempre invocar explicitamente el método save()
para que el código sea más claro sobre lo que se está haciendo y se pueda guardar y verificar si existen errores de validación.
Haciendo la transacción readonly se deshabilita el costo del performance de dirty checking.
@Transactional(readOnly=true)
public void someBusinessMethod() {
....
}
Cuando se obtiene un objeto y se modifica, no es simple obtener los valores originales del objeto.
instance.isDirty()
: Indica si el objeto ha sido modificado desde que se obtuvo.
instance.isDirty('name')
: Indica si el objeto/propiedad ha sido modificado desde que se obtuvo.
getDirtyPropertyNames()
: Obtiene los nombres de las propiedades modificadas.
getPersitentValues()
: Sirve para obtener los valores originales de los objetos antes de haber sido modificados.