2012-06-03 24 views
7

¿Hay alguna manera buena/estándar de ejecutar algún código común antes de cada invocación de save() en clases de dominio?Grails: ¿cómo se ejecuta el código antes de cada guardado?

Por ejemplo, mi dominio

class Page { 

    String url 
    Boolean processed 
    Date date 
    Integer urlCrc 
} 

Mi forma tiene sólo 3 primeros campos y me gustaría para calcular urlCrc cada vez que el método se llama save(). No puedo anular el método de guardar porque está inyectado.

Respuesta

16

Puede usar eventos GORM: consulte el docs. Dado que por defecto validate() se llama antes de cada save() Yo usaría eso.

class Page { 
    //your defs here 

    def beforeValidate() { 
     this.urlCrc = yourComputationHere 
    } 
} 
+0

Gracias, funciona. Desafortunadamente grails.org está fuera de servicio, debido a algunos problemas de enrutamiento http://grails.1312388.n4.nabble.com/Is-the-plugin-repository-down-td4628824i40.html así que necesitaba preguntar aquí – mrok

+0

Lo anterior la solución es probablemente la mejor, pero otra opción es usar un campo calculado de Grails. Ver los documentos para eso. –

+1

Si desea ejecutar el código antes del guardado, use 'beforeUpdate()/beforeInsert()'. si usa 'beforeValidate()' que se llama siempre cuando se llama a 'validate()' (método 'save()' call 'validate()' antes de guardar). Entonces su código se ejecuta antes de validar incluso si no guarda. – IgniteCoders

1
class Page { 
    def beforeInsert() { 
     this.beforeUpdate() 
    } 
    def beforeUpdate() { 
     this.urlCrc = 'calculate something' 
    } 
} 
+1

¿Puede vincular a la documentación sobre esto? – dopatraman

+0

Sí, esta es la [documentación] (http://docs.grails.org/1.3.6/guide/5.%20Object%20Relational%20Mapping%20 (GORM) .html # 5.5% 20Advanced% 20GORM% 20Features) – IgniteCoders

Cuestiones relacionadas