【问题标题】:Grails Grom + mongoDb get during save OptimisticLockingExceptionGrails Grom + mongoDb 在保存期间获取 OptimisticLockingException
【发布时间】:2013-10-21 20:40:11
【问题描述】:

我尝试在 Grails 服务中将对象保存到 mongodb:

Cover saveCover = new Cover()
saveCover.id = url
saveCover.url = url
saveCover.name = name
saveCover.sku = sku
saveCover.price = price

saveCover.save()

覆盖域如下所示:

class Cover {

    String id
    String name
    String url
    String sku
    String price
}

所以我想拥有基于 url 的自定义 id,但在保存过程中出现错误:

无法提交数据存储事务;嵌套异常是 org.grails.datastore.mapping.core.OptimisticLockingException: 在您进行编辑时,实例已被其他用户更新

但是如果我不使用 setter 并且只在构造函数中传递所有值,那么异常就消失了。为什么?

【问题讨论】:

    标签: mongodb grails grails-orm


    【解决方案1】:

    documentation 中所述:

    注意,如果你手动分配一个标识符,那么你将需要使用插入方法而不是保存方法,否则GORM无法判断你是尝试实现插入还是更新

    所以你需要在分配 id 生成器时使用 insert 方法而不是 save

    cover.insert(failOnError: true)
    

    如果你不这样定义映射:

    static mapping = {
        id generator: 'assigned'
    }
    

    并且将使用插入方法,您将获得一个自动生成的 objectId:

    "_id" : "5496e904e4b03b155725ebdb"
    

    【讨论】:

      【解决方案2】:

      当您将 id 分配给新模型并尝试保存它时会发生此异常,因为 GORM 认为它应该进行更新。

      为什么会出现这个异常

      当我遇到这个问题时,我使用的是 1.3.0 的 grails-mongo 插件。这使用了 1.1.9 的 grails 数据存储核心代码。我注意到异常是在847(ish) of NativeEntryEntityPersister 线上生成的。此代码更新数据库中的现有域对象。

      Above that on line 790 是创建isUpdate 的位置,用于查看它是否是更新。 isInsertfalse,因为它只是在强制插入时 truereadObjectIdentifier 将返回已分配给对象的 id,因此 isUpdate 最终将评估为 true。

      修复异常

      感谢第 791 行的&& !isInsert,如果您强制插入,插入代码将被调用,并且异常肯定会消失。但是,当我这样做时,分配的 ID 没有保存,而是使用了生成的对象 ID。我看到解决此问题的方法是在 line 803 上检查生成器是否设置为 "assigned"

      要解决这个问题,您可以添加以下映射。

      class Cover {
          String id
          String name
          String url
          String sku
          String price
          static mapping = {
              id generator: 'assigned'
          }
      }
      

      这样做的副作用是您将始终需要为新的 Cover 域对象分配一个 id。

      【讨论】:

      • 我不明白为什么 GORM 默认会这么认为。你能解释一下吗?
      • 我已经更新了这个问题,详细说明了 gorm 为何这么认为。
      猜你喜欢
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2015-03-05
      • 1970-01-01
      • 2011-11-23
      相关资源
      最近更新 更多