Hibernate Grails和StaleObjectStateException中的GORM
我正在编写一个小的Grails应用程序,在运行以下相当简单的代码时,我一直在为大约1/10的“createfoo”调用获取StaleObjectStateException:s。很可能我错过了使用GORM的最佳方法 代码如下:Hibernate Grails和StaleObjectStateException中的GORM,hibernate,grails,gorm,Hibernate,Grails,Gorm,我正在编写一个小的Grails应用程序,在运行以下相当简单的代码时,我一直在为大约1/10的“createfoo”调用获取StaleObjectStateException:s。很可能我错过了使用GORM的最佳方法 代码如下: def viewfoo = { session.user.refresh() // ... } def createfoo = { session.user.refresh() var user = session.user if (param["n
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最佳实践的问题:
我注意到的一件事是,您没有保存用户,即使您刚刚添加了一些foo。事实上,保存用户应该不需要保存foo 您不必验证用户:它的属性不会被不受信任的源更改,并且无论何时保存,都会检查数据库级别的约束
最后,像user.refresh()这样的东西最好移到您的操作之外,然后移到拦截器或过滤器中。我不太清楚您为什么会遇到问题,但有一种方法可以处理域对象。它允许您将当前对象重新附加到当前持久上下文 我不太清楚您的Foo是什么,或者您对用户对象做了哪些自定义,或者您使用的grails/java版本是否能够重现这一点 我认为这与您在用户对象上进行的刷新有关,这会导致数据库版本更新(从而失去同步),但我不能确定 此外,我相信,根据对的注释,在Grails1.1中,先验证后放弃的行为正在改变,而且不太必要