我正在编写一个小型 Grails 应用程序,并且在运行以下相当简单的代码时,我继续获得 StaleObjectStateException:s 大约 1/10:th 对“createfoo”的调用。很可能我错过了使用 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/休眠异常:
原因:具有标识符 [15] 的类 [Foo] 的对象:乐观锁定失败;嵌套异常是 org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确):[Foo#15]