GORM — временно отключить событие beforeInsert

Есть ли способ временно отключить событие beforeInsert определенного класса домена? Мне нужно выполнить следующие шаги:

  1. отключить выполнение beforeInsert;
  2. Выполнение своего рода процедуры saveAs в объекте;
  3. повторно включить выполнение beforeInsert.

Подпрограмма saveAs выполняет глубокое клонирование определенного объекта и создает новый объект с теми же данными. Посмотрите этот ответ, чтобы понять клон: Я дублирую объект домена в Grails?

Причина отключения beforeInsert: поскольку объект клонирован, код внутри beforeInsert не нужно выполнять при выполнении подпрограммы saveAs.

Версия Grails: 2.5.0

Обновить

Я забыл упомянуть, что хочу избежать изменения класса домена для достижения такого поведения.


person cantoni    schedule 15.10.2015    source источник
comment
Привет @cantoni, ты нашел лучшее решение?   -  person Hemã Vidal    schedule 17.07.2017
comment
К сожалению, нет, @HemãVidal. Мое решение заключалось в том, чтобы не использовать событие beforeInsert. Моя подпрограмма saveAs гораздо важнее, чем код, выполняемый в beforeInsert.   -  person cantoni    schedule 17.07.2017
comment
Я думаю, что это концептуальная проблема: если метод .save() в некоторых ситуациях работает иначе, контроллеры должны выполнить это действие и удалить это поведение из домена.   -  person Hemã Vidal    schedule 18.07.2017


Ответы (1)


Вы можете создать временное логическое поле в классе домена, и на основе значения этого поля вы можете запустить свой код beforeInsert, например;

class Person{

Boolean runBeforeInsert = true

static transients = ['runBeforeInsert']

def beforeInsert(){
    if(runBeforeInsert){
         SOME CODE .....
    }
}
}

Это может быть не лучшее решение, но это одно из решений.

person Uday    schedule 15.10.2015
comment
Спасибо @Uday. Это возможное решение, но я ищу неинвазивное решение. Я хочу избежать изменения класса домена. Спасибо, в любом случае! - person cantoni; 15.10.2015
comment
@cantoni IMO, другого пути нет, и это может быть менее инвазивный метод. - person Pablo Pazos; 30.08.2018