我正在编写一个小的Grails应用程序,但是当运行以下简单代码时,“createfoo”的约1/10调用会出现StaleObjectStateException。很可能我错过了使用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-对象?验证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]