iberck
11/6/2015 - 3:08 AM

Dirty checking

Dirty checking

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.

Deshabilitar dirty checking

Haciendo la transacción readonly se deshabilita el costo del performance de dirty checking.

@Transactional(readOnly=true)
public void someBusinessMethod() {
    ....
}

Obtener los valores originales de un objeto

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.