2012-11-22 18 views
8

Mam kilka Grails klasy 2,1 domen, które zawierają dateCreated i lastUpdated pól GORM zarządza automatycznie, npZastąpić datę GrailsCreated i lastUpdated tylko dla danych testowych?

class Person { 
    Date dateCreated 
    Date lastUpdated 
    String name 
} 

Chcę Grails automatyczne wypełnienie tych pól w czasie wykonywania, ale również chcą utworzyć kilka danych testowych, w których mogę ręcznie zdefiniować wartości tych dat. Kłopot w tym, że Grails automatycznie ustawia wartości, jeśli te pola mają przechwytywacz, nawet gdy je specjalnie ustawiłem.

Widziałem this SO question, który opisuje, jak zezwolić na zmiany do dateCreated, ale muszę również zmienić lastUpdated. czy to możliwe?

+0

Czy próbowałeś użyć tej innej metody? Zakładam, że to nie działa? –

+0

@tim_yates, metoda powiązana z pytaniem pozwala ustawić ręcznie pole 'dateCreated', ale nie pole' lastUpdated'. –

+0

Czy testowałeś? Wydaje się, że wyłącza wszystkie znaczniki czasu, więc lastUpdated jest uwzględniane. –

Odpowiedz

16

Ups, mój błąd, podejście w drugim pytaniu działa, ale dany byt był oddzielnie zapisywany gdzie indziej. Wydaje się też, że potrzebny jest wyraźny flush, aby to wszystko działa:

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

Jeśli jest to próba integracji można użyć instrukcję aktualizacji HQL, aby ręcznie ustawić lastUpdated.