Временно отключить автоштамп Grails

У меня есть задание Grails, которое выполняет некоторую обработку моих данных. Это включает в себя обновление поля заголовка после некоторых манипуляций со строками.

Я пытаюсь, чтобы отметка lastUpdated не затрагивалась описанным выше процессом, поскольку пользователи часто сортируют по lastUpdated.

Есть ли способ временно отключить autoTimestamp? Я использую Грааль 2.4.5.

Я пробовал это предложение, но оно не сработало, а также сильно замедляет обработку (4 секунды превратились в 30 секунд).

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
}

** Обновление ** Также я не ищу решение, связанное с созданием нового поля, которое обновляется только в определенных сценариях (атм).


person Giannis    schedule 14.09.2015    source источник


Ответы (2)


Класс, ответственный за установку метки времени в соответствии с настройкой сопоставления autoTimestamp, называется org.grails.orm.hibernate.support.ClosureEventListener.

Я попытался перехватить вызов handleTimestampingBeforeUpdate с помощью Groovy Category, а также с Interceptor: ничего не получилось. Я подозреваю, что ClosureEventListener работает в другом потоке. Я не пытался использовать ExpandoMetaClass, потому что это внесло бы глобальные изменения, влияющие на все попытки save().

Рекомендация

Я думаю, что лучший вариант для вас это:

  1. Отключите autoTimestamp в закрытии сопоставления.
  2. Добавьте переходное логическое свойство в класс предметной области и используйте его в качестве флага для включения/отключения обновления свойства lastUpdated.
  3. Добавьте замыкание beforeUpdate в класс вашего домена и установите (или нет) свойство lastUpdated вручную в соответствии с переходным флагом.
  4. Измените задание, чтобы отключить флаг перед вызовом save(). Альтернативой является реализация специального метода save(), который делает это.

Важный

Этот подход требует отключения autoTimestamp, поскольку ClosureEventListener устанавливает временную метку после вызова beforeUpdate(). Поэтому, если autoTimestamp не отключен, изменения в lastUpdated, сделанные в beforeUpdate(), будут перезаписаны.

person Emmanuel Rosa    schedule 15.09.2015

Есть флаг autoTimeflag.

Пример использования:

static mapping = {
autoTimestamp false
}
person Corbin    schedule 14.09.2015
comment
Я знаю об этом, но не похоже, что вы можете изменить его во время выполнения. - person Giannis; 14.09.2015