gpt4 book ai didi

hibernate - Grails 中的 GORM 和 StaleObjectStateException

转载 作者:行者123 更新时间:2023-12-04 12:38:41 25 4
gpt4 key购买 nike

我正在编写一个小型的 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中持久化新对象的正确方法吗?
  • 我应该验证我将要 save() 的所有对象吗? IE。我应该验证上面代码中的 Foo-object 和 User-object 吗?验证用户对象是否会隐式检查 Foo 对象的状态?
  • 我做了什么值得 StaleObjectStateException? :-)

  • GORM/Hibernate 异常:

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

    最佳答案

    我注意到的一件事是你没有保存用户,即使你刚刚添加了一些 foo 到它。事实上,保存用户应该避免保存 foo 的需要。

    您不必验证用户:它的属性没有被不受信任的来源更改,并且无论何时保存,都会检查数据库级别的约束。

    最后,像 user.refresh() 这样的东西最好移到你的 Action 之外,进入拦截器或过滤器。

    关于hibernate - Grails 中的 GORM 和 StaleObjectStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/488812/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com