2012-06-03 3 views
7

도메인 클래스의 모든 save() 호출 전에 공통 코드를 실행하는 좋은/표준 방법이 있습니까?Grails - 모든 저장 전에 코드를 실행하는 방법은 무엇입니까?

예를 들어

, 내 도메인

class Page { 

    String url 
    Boolean processed 
    Date date 
    Integer urlCrc 
} 

나의 양식은 3 첫 번째 필드가 나는 urlCrc에게 save() 메소드가 호출 될 때마다 시간을 계산하고 싶습니다. 주입 방법 때문에 저장 메서드를 재정의 할 수 없습니다.

답변

16

GORM 이벤트를 사용할 수 있습니다 (docs 참조). 모든 save() 전에는 기본적으로 validate()이 호출되기 때문에이를 사용합니다.

class Page { 
    //your defs here 

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

감사 기능, 그것을 작동합니다. 불행히도 일부 라우팅 문제로 인해 grails.org이 다운되었습니다 http://grails.1312388.n4.nabble.com/Is-the-plugin-repository-down-td4628824i40.html 그래서 여기에 질문해야합니다 – mrok

+0

위 해결책이 가장 좋을 수도 있지만, 또 다른 옵션은 grails 계산 필드를 사용하는 것입니다. 그것에 대한 문서를 참조하십시오. –

+1

저장하기 전에 코드를 실행하려면 beforeUpdate()/beforeInsert()를 사용하십시오. 'beforeValidate()'를 사용하면'validate()'(save() 메소드를 호출 할 때 항상 호출됩니다. save 전에 validate()를 호출하십시오). 따라서 코드를 저장하지 않아도 유효성을 검사하기 전에 코드가 실행됩니다. – IgniteCoders

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

이 문서에 링크 할 수 있습니까? – dopatraman

+0

예, [documentation] (http://docs.grails.org/1.3.6/guide/5.%20Object%20Relational%20Mapping%20 (GORM) .html # 5.5 % 20Advanced % 20GORM % 20Features) – IgniteCoders

관련 문제