当前位置: 首页 > 面试题库 >

Grails中的GORM和StaleObjectStateException

阎修杰
2023-03-14
问题内容

我正在编写一个小型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最佳做法的疑问:

  1. “ if-validate()-then-save()-else-discard()”是否是在GORM中持久保存新对象的正确方法?

  2. 是否应该验证所有要保存的对象()?即我应该同时验证上述代码中的Foo对象和User对象吗?验证用户对象会隐式检查Foo对象的状态吗?

  3. 我该怎么做才能得到StaleObjectStateException?:-)

GORM /hibernate异常:

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

问题答案:

我不确定您为什么遇到问题,但是域对象上有一个合并方法。它使您可以将当前对象重新附加到当前持久性上下文。

我对您的Foo,对User对象所做的自定义或用于重现此功能的grails / java版本了解得不够多。

我认为这与您在用户对象上进行的刷新有关,这导致数据库版本被更新(因此不同步),但是我不确定。

另外,我相信基于该帖子的评论,验证然后丢弃行为正在改变,而在grails
1.1中则没有必要



 类似资料:
  • 问题内容: 我正在尝试在GORM中定义树结构。这是我的模型: 插入似乎可以正常工作,但是当我无法加载具有多个级别和子级别的Tree时。我想我在关系中错过了一些东西:-树应该引用rootLevel(以及可选地引用所有子级别)-一个级别应该引用其父级别,其子级别和全局父树 您能指出我正确的方向以获得这样的树结构吗?谢谢 问题答案: 我最终得到了这个解决方案(感谢朋友): 和 我错过了Tree和Leve

  • 问题内容: 是否可以使用GORM标准执行“输入”标准。我正在寻找以下SQL的等效项 如果可能的话,我猜语法会像这样: 问题答案: Grails createCriteria文档包含一个使用子句的示例: 该文档包括以下说明: 注意:“ in”是一个时髦的保留字,因此必须用引号将其转义。

  • 我需要在Grails中使用GROUP_CONCAT聚合函数,最好来自HQL,但也可以使用标准。 我有以下疑问: } 还是没运气。我得到: -[METHOD_CALL]methodnode:'('+-[METHOD_NAME]identnode:'group_concat'{originaltext=group_concat}-[EXPR_LIST]sqlnode:'expr list'-[DOT]

  • 我们有一个高并发的Grails应用程序,有几个工作线程试图更新同一个域对象Message,但是在服务中使用静态锁Message.lock(msg.id)实现的悲观锁定解决方案(transactional设置为false)会导致许多< code > HibernateOptimisticLockingFailureException 的实例。 静态锁如何导致?我的理解是,静态锁将读取最新的持久版本。

  • grails GORM的SQL标准是什么 订单表: 订单ID CustomerID 订购日期 客户表: CustomerID 客户名 联系人姓名 国家 请注意,“Orders”表中的“CustomerID”列指的是“客户”表中的“CustomerID”。上面两个表之间的关系是“CustomerID”列。然后,我们可以创建以下SQL语句(包含一个INNER JOIN),它选择两个表中具有匹配值的记录

  • 找到了以下场景的部分答案,但需要进一步澄清。 有下列情况: 用java编写的域类 我想做的事情: 创建一个grails应用程序,它可以执行以下操作: 使用java域类作为grails域类 通过GORM将java域类映射到DB 能够从groovy域类创建java域类,以便能够将其发送到java服务器进行处理,然后接收java类响应并将其转换为groovy类,以便使用GORM存储在DB中映射 基本上有