我正在编写一个小型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最佳做法的疑问:
“ if-validate()-then-save()-else-discard()”是否是在GORM中持久保存新对象的正确方法?
是否应该验证所有要保存的对象()?即我应该同时验证上述代码中的Foo对象和User对象吗?验证用户对象会隐式检查Foo对象的状态吗?
我该怎么做才能得到StaleObjectStateException?:-)
GORM /hibernate异常:
原因:标识符为[15]的类[Foo]的对象:乐观锁定失败;嵌套的异常是org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确):[Foo#15]
我不确定您为什么遇到问题,但是域对象上有一个合并方法。它使您可以将当前对象重新附加到当前持久性上下文。
我对您的Foo,对User对象所做的自定义或用于重现此功能的grails / java版本了解得不够多。
我认为这与您在用户对象上进行的刷新有关,这导致数据库版本被更新(因此不同步),但是我不确定。
另外,我相信基于该帖子的评论,验证然后丢弃行为正在改变,而在grails 1.1中则没有必要