Почему сеттеры в Grails вызываются дважды при сохранении? - PullRequest
2 голосов
/ 04 ноября 2010

Посмотрите на следующий класс домена Grails, который изменяет значение в установщике, если объект сохраняется в первый раз (если у него нет идентификатора):

class Idtest {

  String name

  void setName(String name) {
    if(!this.id)
      this.name = name + "TEST"
    else
      this.name = name
  }

}

Если я сгенерирую представления и контроллер с generate-all, запустите приложение и введите «привет» в сгенерированную форму, «helloTESTTEST» будет сохранено.

Функция save выглядит следующим образом:

def save = {
    def idtestInstance = new Idtest(params)
    if (idtestInstance.save(flush: true)) {
        flash.message = "${message(code: 'default.created.message', args: [message(code: 'idtest.label', default: 'Idtest'), idtestInstance.id])}"
        redirect(action: "show", id: idtestInstance.id)
    }
    else {
        render(view: "create", model: [idtestInstance: idtestInstance])
    }
}

Почему сеттер вызывается дважды?

Ответы [ 2 ]

1 голос
/ 20 января 2012

Вместо выполнения if (! This.id) {} ​​

Вы должны использовать beforeInsert ()

Расширенные функции GORM

0 голосов
/ 04 ноября 2010

Я полагаю, что он вызывается один раз, когда вы создаете объект, и он сохраняется

Затем он вызывается снова, когда вы извлекаете объект из базы данных.

Итак ..

При сохранении в базе данных свойство устанавливается, давайте предположим, что counter = counter + 1. Итак, теперь он сохраняется в базе данных.

При извлечении объекта из базы данных доменобъектный установщик будет вызван снова, таким образом увеличивая счетчик снова counter ++

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

...