Save update GORM
Grails utiliza hibernate y automáticamente une la sesión de hibernate al request en ejecución. Esto permite utilizar los métodos save, delete, entre otros transparentemente.
Hibernate tiene la ventaja ante otros frameworks de ir encolando operaciones que se sincronizarán hacia la bd, a menudo hasta que se haga flush y se cierre la sesión (esto lo hace por automático grails). Gracias a este esquema se incrementa el performance gracias a que se ejecutan todos los cambios de un solo golpe.
Otro caso donde hibernate sincroniza los cambios pendientes hacia la bd es cuando se ejecutan queries, esto con el objetivo de obtener los valores correctos de los objetos.
No existe el método update, si no existe el objeto save lo creará, si existe el objeto save lo actualizará.
Cuando invocas save no siempre se guarda la instancia de inmediato, o podría incluso no guardarse por un error de validación.
En el siguiente código no será enviado el save de inmediato a la bd sino que se encolará y se ejecutará hasta que se haga flush y se cierre la sesión.
def p = new Persona()
p.save()
def p = new Persona()
p.save(flush:true)
Sincroniza el cambio hacia la bd y todos los cambios pendientes ya que se está haciendo flush de la sesión.
Cada que se guarda un objeto Grails valida que los datos que tiene sean válidos contra sus constraints definidos. Sin embargo hay que tomar en cuenta que la validación sucede de manera silenciosa, no sabrás si hubo o no un error a menos que evalues si save retornó null o invocando hasErrors()
. Comunmente este comportamiento es muy utilizado en la web.
def book = new Book(params)
if (!book.save()) {
falló save, presentar errors al cliente.
}
Cuando crees tus objetos en Bootstrap.groovy, ahí sí es recomendado lanzar una excepción porque el programador fue quien se equivocó en la captura de datos y ese no es un comportamiento esperado:
book.save(failOnError:true)
Utiliza save(failOnError:true)
cuando testees datos o hagas bootstraping, si estás en la web no utilices failOnError:true
, en vez de ello valida/muestra errores.