Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate Grails和StaleObjectStateException中的GORM_Hibernate_Grails_Gorm - Fatal编程技术网

Hibernate Grails和StaleObjectStateException中的GORM

Hibernate Grails和StaleObjectStateException中的GORM,hibernate,grails,gorm,Hibernate,Grails,Gorm,我正在编写一个小的Grails应用程序,在运行以下相当简单的代码时,我一直在为大约1/10的“createfoo”调用获取StaleObjectStateException:s。很可能我错过了使用GORM的最佳方法 代码如下: def viewfoo = { session.user.refresh() // ... } def createfoo = { session.user.refresh() var user = session.user if (param["n

我正在编写一个小的Grails应用程序,在运行以下相当简单的代码时,我一直在为大约1/10的“createfoo”调用获取StaleObjectStateException:s。很可能我错过了使用GORM的最佳方法

代码如下:

def viewfoo = {
  session.user.refresh()
  // ...
}

def createfoo = {
  session.user.refresh()
  var user = session.user
  if (param["name"]) {
    var newFoo = new Foo()
    newFoo.name = param["name"]
    if (newFoo.validate()) {
      newFoo.save()
      if (user.validate()) {
        user.addToFoos(newFoo)
      } else {
        user.discard()
      }
    } else {
      newFoo.discard()
    }
  }
}
我对GORM最佳实践的问题:

  • “if-validate()-then-save()-else-discard()”是在GORM中持久化新对象的正确方法吗

  • 是否要验证要保存的所有对象()?也就是说,我应该在上面的代码中同时验证Foo对象和User对象吗?验证用户对象是否会隐式检查Foo对象的状态

  • 我做了什么才配得到StaleObjectStateException?:-)

  • GORM/Hibernate异常:

    Caused by: Object of class [Foo] with identifier [15]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [Foo#15] 原因:标识符为[15]的类[Foo]的对象:乐观锁定失败;嵌套异常为org.hibernate.StaleObjectStateException:行被另一个事务更新或删除(或未保存的值映射不正确):[Foo#15]
    我注意到的一件事是,您没有保存用户,即使您刚刚添加了一些foo。事实上,保存用户应该不需要保存foo

    您不必验证用户:它的属性不会被不受信任的源更改,并且无论何时保存,都会检查数据库级别的约束


    最后,像user.refresh()这样的东西最好移到您的操作之外,然后移到拦截器或过滤器中。

    我不太清楚您为什么会遇到问题,但有一种方法可以处理域对象。它允许您将当前对象重新附加到当前持久上下文

    我不太清楚您的Foo是什么,或者您对用户对象做了哪些自定义,或者您使用的grails/java版本是否能够重现这一点

    我认为这与您在用户对象上进行的刷新有关,这会导致数据库版本更新(从而失去同步),但我不能确定

    此外,我相信,根据对的注释,在Grails1.1中,先验证后放弃的行为正在改变,而且不太必要