[英]Unexpected OptimisticLockingException on MongoTemplate.save
[英]Grails Grom + mongoDb get during save OptimisticLockingException
我嘗試在grails服務中將對象保存在mongodb中:
Cover saveCover = new Cover()
saveCover.id = url
saveCover.url = url
saveCover.name = name
saveCover.sku = sku
saveCover.price = price
saveCover.save()
Cover域如下所示:
class Cover {
String id
String name
String url
String sku
String price
}
所以我想有基於URL的自定義ID,但是在保存過程中出現錯誤:
無法提交數據存儲事務; 嵌套的異常是org.grails.datastore.mapping.core.OptimisticLockingException:該實例是在您編輯時由另一個用戶更新的
但是我沒有使用設置器,只是在構造函數中傳遞了所有值,所以這個異常消失了。 為什么?
如此處文檔所述 :
請注意,如果您手動分配標識符,則將需要使用insert方法而不是save方法,否則GORM無法確定您是要實現插入還是更新
因此,分配ID生成器后,您需要使用插入方法而不是保存
cover.insert(failOnError: true)
如果沒有這樣定義映射:
static mapping = {
id generator: 'assigned'
}
並將使用insert方法,您將獲得一個自動生成的objectId:
"_id" : "5496e904e4b03b155725ebdb"
當您為新模型分配ID並嘗試保存它時會發生此異常,因為GORM認為它應該進行更新。
當我遇到這個問題時,我使用的是grails-mongo插件的1.3.0。 它使用了grails數據存儲核心代碼的1.1.9。 我注意到該異常是在NativeEntryEntityPersister的第847(ish)行上生成的 。 此代碼更新數據庫中現有的域對象。
在790行的 isUpdate
是創建isUpdate
地方,用於查看它是否為更新。 isInsert
為false
,因為僅當強制插入並且readObjectIdentifier
將返回已分配給該對象的id時,它才為true
,因此isUpdate
最終將評估為true。
感謝第791行的&& !isInsert
,如果您強制執行插入操作,則將調用插入代碼,並且可以肯定該異常將消失。 但是,當我這樣做時,分配的ID並沒有保存,而是使用了生成的對象ID。 我看到解決此問題的方法是在第803行 ,它檢查生成器是否設置為"assigned"
。
要解決此問題,您可以添加以下映射。
class Cover {
String id
String name
String url
String sku
String price
static mapping = {
id generator: 'assigned'
}
}
這樣做的副作用是,您將始終需要為新的Cover域對象分配一個ID。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.