Grails: возможно ли запросить обновленный сохраненный объект из afterInsert () или afterUpdate ()? - PullRequest
0 голосов
/ 11 сентября 2018

Скажите, у меня есть модель Person.Мой домен использует триггеры GORM следующим образом:

def afterInsert() {
    someService.someMethod(this.id)
}

def afterUpdate() {
    someService.someMethod(this.id)
}

SomeService будет выглядеть так:

def someMethod(id) {
    // This query returns stale object
    def person = Person.findById(id)
}  

Всякий раз, когда вызывается someMethod() в SomeService,запрос не возвращает обновленный объект.Вместо этого он получает старую версию / данные.

Я предполагаю, что к моменту вызова afterUpdate() изменения еще не сохраняются в БД.Я также пытался person.refresh(), но, очевидно, он сталкивается с той же проблемой.
Я также пытался .save(flush:true) в исходном сервисе, где объект сохраняется, но он все еще возвращает старые данные в gormМетод триггера.

Так есть ли у меня возможность запросить объект Person таким образом, чтобы он получал самые последние данные?
Я немного озадачен тем, как это можно реализовать.

1 Ответ

0 голосов
/ 12 сентября 2018

Если возможно, избегайте взаимодействия с базой данных с помощью gorm-хуков, так как вы столкнетесь с проблемами, когда ваше приложение будет расти, и вы в конечном итоге отладите множество исключений StaleObject или OptimisticLocking или другое странное поведение, которое вы видите сейчас.

Лучше изменить здесь базовый дизайн, если это возможно, и позволить, например, сервису работать как персистентный объект здесь, если вам нужна дополнительная логика.Возможно, вы можете использовать какой-то механизм, управляемый событиями, например activemq.

Внедрение службы в класс домена является нарушением дизайна и по умолчанию запрещено в grails 3.x по соображениям производительности.Следует всегда избегать, если это возможно.Активная запись вызовет у вас проблемы, если вы продолжите толкать ее к краю вот так.

...