2012-02-28 22 views
8

Según lo que he leído, save() informa el contexto de persistencia que una instancia debe guardarse o actualizarse. Sin embargo, tengo métodos en un servicio que cambian la propiedad de una instancia de dominio sin llamar al save() y el cambio aparece instantáneamente en mi base de datos, no hay problema.¿Cuándo debo llamar a save() en una instancia de un objeto de dominio en Grails?

¿Es el método save() una forma más segura de saber que una instancia de dominio se actualizará después de realizar un cambio (y detectar errores con la asignación failOnError)? ¿Debería usarse CADA vez que cambio las propiedades de una instancia de dominio o eso es exagerar?

+0

¿La base de datos se actualiza al instante o su caché de hibernación se actualiza al instante? – doelleri

+0

Se está actualizando la base de datos MySql que estoy usando. – Weezle

Respuesta

8

Si crea una nueva instancia de una clase de dominio, una llamada .save() le dirá a la capa subyacente de Hibernate que persista el nuevo objeto en la base de datos. Sin el .save(), no se conservará en la base de datos.

Si recupera un objeto a través de un .get(myId), cualquier cambio se mantendrá automáticamente en la base de datos al final de la transacción subyacente porque Hibernate ve el objeto como "sucio". El final de una transacción se produce al final de una llamada de método a un servicio transaccional o al final de una solicitud de controladores. Puede llamar al .save() si lo desea en estas instancias, pero no es necesario. Proporciona un acceso fácil a la limpieza de Hibernate a través del .save(flush:true) o el uso de failOnError para la validación.

+0

Uso un .findBy() para recuperar el objeto, pero supongo que tiene el mismo efecto de "guardar al final del método" como .get. – Weezle

+0

Sí, la persistencia se produce para cualquier método de recuperación de un objeto existente, a menos que sea una recuperación de solo lectura como '.read()'. – schmolly159

+0

Aprovechar la validación es probablemente uno de los usos más comunes de 'save()' fuera de persistir una nueva instancia. – cdeszaq

Cuestiones relacionadas