一尘不染

Grails中的GORM和StaleObjectStateException

hibernate

我正在编写一个小型Grails应用程序,并且在运行以下相当简单的代码时,我继续获得StaleObjectStateException:s约占“
createfoo”调用的1/10:th。很可能我错过了使用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最佳做法的疑问:

  1. “ if-validate()-then-save()-else-discard()”是否是在GORM中持久保存新对象的正确方法?

  2. 是否应该验证所有要保存的对象()?即我应该同时验证上述代码中的Foo对象和User对象吗?验证用户对象会隐式检查Foo对象的状态吗?

  3. 我该怎么做才能得到StaleObjectStateException?:-)

GORM /hibernate异常:

原因:标识符为[15]的类[Foo]的对象:乐观锁定失败;嵌套的异常是org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确):[Foo#15]

阅读 274

收藏
2020-06-20

共1个答案

一尘不染

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

我对您的Foo,对User对象所做的自定义或用于重现此功能的grails / java版本了解得不够多。

我认为这与您在用户对象上进行的刷新有关,这导致数据库版本被更新(因此不同步),但是我不确定。

另外,我相信基于该帖子的评论,验证然后丢弃行为正在改变,而在grails
1.1中则没有必要

2020-06-20