2012-11-22 3 views
8

私は例えばGORMは自動的に管理さdateCreatedlastUpdatedフィールドを含み、いくつかのGrails 2.1ドメインクラスを持っている:テストデータのみGrailsのdateCreatedおよびlastUpdatedをオーバーライドしますか?

class Person { 
    Date dateCreated 
    Date lastUpdated 
    String name 
} 

私は Grailsのが自動的に実行時にこれらのフィールドに入力したい、私もにしたい私は手動でこれらの日付の値を定義することができますいくつかのテストデータを作成します。問題は、Grailsが特別に設定した場合でも、これらのフィールドがインターセプタで自動的に値を設定することです。

私はdateCreatedに変更を許可する方法を説明しているthis SO questionを見ましたが、lastUpdatedも変更する必要があります。これは可能ですか?

+0

他の方法を試しましたか?私はそれがうまくいかなかったと思いますか? –

+0

@tim_yatesという質問にリンクされたメソッドを使用すると、 'dateCreated'フィールドを手動で設定できますが、' lastUpdated'フィールドは手動で設定することができません。 –

+0

テストしましたか?すべてのタイムスタンプを無効にするように見えるので、lastUpdatedが含まれています。 –

答えて

16

私の間違いとして、他の質問のアプローチはうまくいきますが、問題のエンティティは別に別の場所に保存されていました。また、あなたは物事を動作させるために、明示的なflushを必要とするようだ:

def withAutoTimestampSuppression(entity, closure) { 
    toggleAutoTimestamp(entity, false) 
    def result = closure() 
    toggleAutoTimestamp(entity, true) 
    result 
} 

def toggleAutoTimestamp(target, enabled) { 
    def applicationContext = (ServletContextHolder.getServletContext()               
           .getAttribute(ApplicationAttributes.APPLICATION_CONTEXT)) 

    def closureInterceptor = applicationContext.getBean("eventTriggeringInterceptor") 
    def datastore = closureInterceptor.datastores.values().iterator().next() 
    def interceptor = datastore.getEventTriggeringInterceptor() 

    def listener = interceptor.findEventListener(target) 
    listener.shouldTimestamp = enabled 
    null 
} 

def createTestPerson() { 

    def luke = new Person(name: "Luke Skywalker") 
    withAutoTimestampSuppression(luke) { 

     def lastWeek = new Date().minus(7) 
     luke.dateCreated = lastWeek 
     luke.lastUpdated = lastWeek 
     luke.save(failOnError: true, flush: true) 
    } 
} 
2

それはあなたが手動でlastUpdatedを設定するには、HQLのUPDATEステートメントを使用することができ、統合テストである場合。