Grails Grom+;mongoDb在保存期间获取优化锁定异常
我尝试在Grails服务中将对象保存到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
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"
我不明白戈姆为什么默认这么想。你能解释一下吗?我已经更新了问题的更多细节,说明了戈姆为什么会这样想。我不明白戈姆为什么会默认这样想。你能解释一下吗?我已经更新了这个问题,更详细地解释了戈姆为什么会这样想。