【问题标题】:Grails update database row exceptionGrails 更新数据库行异常
【发布时间】:2013-06-06 20:41:05
【问题描述】:

我正在使用 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)
           })          
       }
  }

发送邮件后报错。

【问题讨论】:

  • 我猜你在用户域中也有static auditable = true
  • sendMail 的内容是什么?
  • 您的项目环境是什么?生产或开发
  • 我在用户域中设置了 static auditable = true 并且项目环境正在开发中。

标签: grails


【解决方案1】:

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

       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
    }

现在应该可以了。

我认为您的 params 地图将 id 作为属性并设置为

user.properties = params

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

【讨论】:

  • 我已经尝试过了,但仍然存在同样的问题。如果有其他解决方案,请建议我。
  • 另一个错误是 - 无法将数据库状态与会话同步
  • 在对象保存上添加failOnError:true,并检查错误。对于无法将数据库状态与会话同步,请发出 try object.refresh(),它可能会有所帮助。请查看更新的答案
  • 还有一件事,对于无法将数据库状态与会话同步的问题,请查看问题中的答案:stackoverflow.com/questions/9036274/… 他建议在使用之前将键更改为字符串。看看能不能帮上忙。
  • 今天我试了一下,但得到了 -org.springframework.orm.hibernate3.HibernateOptimisticLockingFailure 异常:带有标识符 [2] 的类 [com.web.User] 的对象:乐观锁定失败;嵌套异常是 org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确):[com.web.User#2]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
相关资源
最近更新 更多