簡體   English   中英

Grails Grom + mongoDb在保存期間獲取OptimisticLockingException

[英]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地方,用於查看它是否為更新。 isInsertfalse ,因為僅當強制插入並且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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM