2012-11-22 15 views
8

Ich habe mehrere Grails 2.1 Domain-Klassen, die dateCreated und lastUpdated Felder umfassen, die GORM automatisch verwaltet, zB:Grails dateCreated und lastUpdated nur für Testdaten überschreiben?

class Person { 
    Date dateCreated 
    Date lastUpdated 
    String name 
} 

I Grails möchte zur Laufzeit automatisch in diesen Bereichen füllen, aber ich auch wollen Erstellen Sie einige Testdaten, in denen ich die Werte dieser Daten manuell definieren kann. Das Problem ist, dass Grails automatisch die Werte einstellt, wenn diese Felder mit einem Interceptor versehen sind, selbst wenn ich sie speziell eingestellt habe.

Ich habe this SO question gesehen, die beschreibt, wie man Änderungen zu dateCreated erlaubt, aber ich muss auch lastUpdated ändern. Ist das möglich?

+0

Haben Sie versucht, diese andere Methode zu verwenden? Ich nehme an, es hat nicht funktioniert? –

+0

@tim_yates, die Methode, die in der Frage verknüpft ist, ermöglicht es mir, das Feld "dateCreated" manuell, aber nicht das Feld "lastUpdated" festzulegen. –

+0

Haben Sie getestet? Es scheint alle Zeitstempel zu deaktivieren, also ist lastUpdated enthalten. –

Antwort

16

Whoops, mein Fehler, der Ansatz in der anderen Frage funktioniert, aber die betreffende Entität wurde getrennt woanders gespeichert. Es scheint auch, dass Sie eine explizite flush müssen die Dinge funktionieren:

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

Wenn es ein Integrationstest ist es, Ihnen eine hql Update-Anweisung verwenden können, um Lastupdated manuell einstellen.