Не вызван метод Grails GORM BeforeUpdate

#hibernate #grails #grails-orm

#переход в спящий режим #grails #grails-orm

Вопрос:

Я пытаюсь устранить проблему с моим приложением, из-за которой beforeUpdate метод в одном из моих классов домена не вызывается.

Если ни одно из полей, принадлежащих непосредственно классу домена, не обновляется, beforeUpdate событие не запускается. Я думаю, это имеет смысл, однако я бы хотел, чтобы код в моем beforeUpdate методе выполнялся даже в тех случаях, когда обновляются только ассоциации моего доменного класса.

Например, мой класс домена выглядит примерно так:

 class Organisation {
    String name
    Location location

    def beforeUpdate() {
        //do some stuff with the location when it's updated
    }
}
  

Если карта параметров, отправленная из формы, содержит name параметр, то beforeUpdate запускается. Если карта параметров содержит только location параметры, то это не так.

Есть ли какой-либо способ заставить Grails запускаться beforeUpdate , даже если я только обновляю ассоциации?

Ответ №1:

Краткий ответ на ваш вопрос:

beforeUpdate не сработает, если не изменилось одно из значений свойств в классе домена.

В вашем случае beforeUpdate не вызывается, потому что никакое свойство Organisation не изменилось.

Единственное, что я могу придумать, чтобы сделать в этой ситуации, это изменить вашу модель домена, чтобы она могла Location знать о ее владельце Organisation и вручную вызывать beforeUpdate изнутри Location . beforeUpdate Тем не менее, это кажется хакерским и плохо пахнет.

Комментарии:

1. Вы правы — и это хорошее предложение для грязного взлома, хотя оно не работает, если location изначально равно null .

Ответ №2:

beforeUpdate Метод запускается только тогда, когда объект фактически обновляется, вы, вероятно, видите, что при отправке только одного параметра ваш экземпляр домена находится в недопустимом состоянии и не проверяется, следовательно, никогда не обновляется. То, что вы, вероятно, ищете для решения вашего дела, — это beforeValidate метод.