Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails Grom+;mongoDb在保存期间获取优化锁定异常_Mongodb_Grails_Gorm - Fatal编程技术网

Grails Grom+;mongoDb在保存期间获取优化锁定异常

Grails Grom+;mongoDb在保存期间获取优化锁定异常,mongodb,grails,gorm,Mongodb,Grails,Gorm,我尝试在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

我尝试在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,只是在构造函数中传递所有值,那么异常就消失了。为什么?

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

为什么会发生这种异常 当我遇到这个问题时,我使用的是GrailsMongo插件的1.3.0。它使用了grails数据存储核心代码的1.1.9。我注意到异常是在线生成的。此代码更新数据库中的现有域对象

是创建
isUpdate
的位置,用于查看它是否为更新
isInsert
false
,因为只有在强制插入时它才是
true
,并且
readObjectIdentifier
将返回已分配给对象的id,因此
isUpdate
将最终计算为true

修复异常 多亏了
&&!第791行的isInsert
如果强制插入,则会调用插入代码,并确保异常会消失。但是,当我这样做时,没有保存指定的id,而是使用生成的对象id。我看到这个问题的解决方法是检查生成器是否设置为
“assigned”

要解决此问题,可以添加以下映射

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

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

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

为什么会发生这种异常 当我遇到这个问题时,我使用的是GrailsMongo插件的1.3.0。它使用了grails数据存储核心代码的1.1.9。我注意到异常是在线生成的。此代码更新数据库中的现有域对象

是创建
isUpdate
的位置,用于查看它是否为更新
isInsert
false
,因为只有在强制插入时它才是
true
,并且
readObjectIdentifier
将返回已分配给对象的id,因此
isUpdate
将最终计算为true

修复异常 多亏了
&&!第791行的isInsert
如果强制插入,则会调用插入代码,并确保异常会消失。但是,当我这样做时,没有保存指定的id,而是使用生成的对象id。我看到这个问题的解决方法是检查生成器是否设置为
“assigned”

要解决此问题,可以添加以下映射

class Cover {
    String id
    String name
    String url
    String sku
    String price
    static mapping = {
        id generator: 'assigned'
    }
}
这样做的一个副作用是,您将始终需要为新的Cover domain对象分配一个id。

如此处所述:

请注意,如果手动分配标识符,则需要使用insert方法而不是save方法,否则GORM无法确定您是在尝试实现插入还是更新

因此,在分配id生成器时,需要使用insert方法而不是save方法

cover.insert(failOnError: true)
如果不这样定义映射:

static mapping = {
    id generator: 'assigned'
}
并将使用insert方法,您将获得一个自动生成的objectId:

"_id" : "5496e904e4b03b155725ebdb"
如本报告所述:

请注意,如果手动分配标识符,则需要使用insert方法而不是save方法,否则GORM无法确定您是在尝试实现插入还是更新

因此,在分配id生成器时,需要使用insert方法而不是save方法

cover.insert(failOnError: true)
如果不这样定义映射:

static mapping = {
    id generator: 'assigned'
}
并将使用insert方法,您将获得一个自动生成的objectId:

"_id" : "5496e904e4b03b155725ebdb"

我不明白戈姆为什么默认这么想。你能解释一下吗?我已经更新了问题的更多细节,说明了戈姆为什么会这样想。我不明白戈姆为什么会默认这样想。你能解释一下吗?我已经更新了这个问题,更详细地解释了戈姆为什么会这样想。