Grails — перед вставкой исключение выдает нулевой идентификатор исключения в записи

Я пытаюсь использовать beforeInsert в своем классе пользовательского домена.

 class User {

    String reEnterPassword

    static constraints = {

        password(blank: false, nullable: false, size:5..50, validator: {password, obj ->
         def reEnterPassword = obj.properties['reEnterPassword']
         if(reEnterPassword == null) return true 
         reEnterPassword == password ? true : ['invalid.matchingpasswords']
         })
        reEnterPassword(bindable:true, blank: false);
    }


    def beforeInsert = {
        password = password.encodeAsSHA()
        }

    String toString(){
        name
        }


    static transients = ['reEnterPassword']

    }

в моем контроллере у меня есть метод сохранения (сгенерированный)

    def save() {
    def userInstance = new User(params)
    if (!`userInstance.save(flush: true)`) {
        render(view: "create", model: [userInstance: userInstance])
        return
    }

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

В документации по автоматической отметке времени я прочитал, что не пытайтесь сбросить сеанс внутри события (например, с помощью obj.save(flush:true)). Поскольку события запускаются во время сброса, это вызовет StackOverflowError.

В этом случае, как сохранить мой userInstance.save(flush: true) Я пытался удалить flush:true, но все равно получаю ту же ошибку. если я уберу flus:true..то когда мне нужно позвонить. Когда спящий режим сбросит все эти записи.

Я попробовал решение, определенное этот билет JIRA Пожалуйста, помогите мне. Спасибо


person vishnu    schedule 27.08.2012    source источник
comment
Любая вещь, необходимая для ответа на вопрос. Пожалуйста, помогите мне. Спасибо   -  person vishnu    schedule 28.08.2012


Ответы (3)


Может быть, у вас есть другие ошибки проверки?

Если вы поместите свой код в метод beforeValidate, он будет работать:

def beforeValidate = {
     password = password.encodeAsSHA()
}

Думаю, я слишком поздно, чтобы помочь вам, но я надеюсь, что это поможет другим с той же проблемой.

Привет, Урс.

person Urs    schedule 23.01.2013

Измените свой

def beforeInsert = {
    password = password.encodeAsSHA()
}

to

def beforeInsert() {
    password = password.encodeAsSHA()
}

и это должно помочь

person Jessica    schedule 28.08.2012
comment
Спасибо за ответ. Но тем не менее я получаю ту же ошибку. Класс org.hibernate.AssertionFailure Message null id в записи com.valuelabs.bets.User (не очищайте сеанс после возникновения исключения). - person vishnu; 29.08.2012

Я считаю, что если метод beforeInsert возвращает false, вы получаете исключение «нулевой идентификатор в записи». Возможно, это рассматривается как указание на то, что проверка не удалась.

например следующее вызовет исключение

def beforeInsert() {
  flag = false
}

однако следующее должно работать нормально

def beforeInsert() {
  flag = false
  return true
}
person ian    schedule 06.11.2012