Grails中的GORM和StaleObjectStateException

我正在编写一个小的Grails应用程序,并且在运行以下相当简单的代码时,我一直在获取StaleObjectStateException:s约为“createfoo”调用次数的1/10: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对象和用户对象? 将验证用户对象隐式检查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]
    

    我不确定你为什么遇到问题,但是域对象有一个合并方法。 它使您可以将当前对象重新附加到当前的持久性上下文。

    我不太了解你的Foo,或者你对User对象所做的定制,或者你使用的grails / java版本能够重现这一点。

    我认为这与你对用户对象的刷新有关,这会导致数据库版本更新(因此不同步),但我无法确定。

    另外,我认为,基于这篇文章的评论,验证和放弃行为正在发生变化,在grails 1.1中变得不那么必要


    我注意到的一件事是,即使您刚添加了一些foo,您也不会保存用户。 事实上,保存用户应该避免保存foo的需要。

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

    最后,诸如user.refresh()之类的东西最好移动到你的动作之外并进入拦截器或过滤器。

    链接地址: http://www.djcxy.com/p/42233.html

    上一篇: GORM in Grails and StaleObjectStateException

    下一篇: Jquery confirmation box