#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
метод.