0

我正在使用 grails,并且我有 web 应用程序。在其中调用更新用户配置文件时,我有它的服务,在其中我通过请求参数设置当前用户属性

user.properties = params (params-request parameters),

在我的用户域类中,我有onChange方法(审计插件)。因此,当控制转到用户域onChange方法时,在将属性设置为用户配置文件后调用此方法时,它会给出错误

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.web.User#3].

我仍在寻找如何更新行的解决方案。提前致谢。

//userController update method -     
def user = User.get(params.id)   
user.properties = params                                
user.save(flush:true)      

//and in user domain onChange method-   

  def onChange = { oldMap,newMap ->
        try{
            Msg.append("Your profile has been updated successfully with the following changes: ");
            oldMap.each({ key, oldVal ->
                if(oldVal != newMap[key]) {
                  if(key =="firstName" || key =="gender" || key =="lastName" || key =="phoneNo" || key =="city"){
                      Msg.append(" * $key changed from $oldVal to " + newMap[key])
                  }
                }
                sendMail(Msg,newMap.email)
           })          
       }
  }

发送电子邮件后,它给出了一个错误。

4

1 回答 1

0

我认为如果您尝试在用户对象上设置所有字段,那么它将起作用:

       def user = User.get(params.id)   
       user.refresh() 
       user.firstName= params.firstName
       user.lastName= params.lastName
       user.gender= params.gender
       user.phno= params.phno
       user.city= params.city


    if(user.save(flush:true, failOnError:true)){
      // Now send success email
    }

现在它应该可以工作了。

我认为您的参数映射将 id 作为属性并设置

user.properties = params

它尝试为用户对象设置 id,这就是您遇到问题的原因。

于 2013-05-28T12:30:03.507 回答