2011-08-14 49 views
2

我在通過JSON發送的客戶端保存對象時存在一個非常基本的問題。Grails Gorm部分保存

我有一個客戶對象被轉移到客戶端,編輯完客戶後將其發送回Grails並需要保存在數據庫中。爲了提高性能,我不通過電線發送完整的客戶對象。

現在的問題是,如果我想存儲客戶對象Grails驗證當然客戶對象的關係並失敗。這是好的,因爲我沒有發送關係。

我的問題是現在我該如何解決這個問題呢?我是否需要使用客戶ID再次查詢數據庫並更新已編輯的屬性或者是否有更優雅的方式?從數據庫角度看,這看起來有點貴,因爲每次存儲對象時都需要讀取數據庫。從代碼角度來看,我需要檢查設置了哪些屬性並更新它們。

謝謝!

回答

3

你不能使用save()來進行部分更新,因爲grails無法猜測你實際想要更新的字段:也許你真的想將field-value設置爲NULL,所以Grails不能忽略這些字段。所以我看到兩個選項:

  1. 像你描述的那樣:從DB加載實例,設置值並再次保存。你已經提到過,你不喜歡關注更新的字段,而只是想獲取JSON實例的所有屬性。因此,假如你已經被解析JSON-實例稱爲jsonInstance和客戶的數據庫版本是customerInstance,你可以這樣做:

    jsonInstance.properties.each { field -> 
        customerInstance."${field.key}" = field.value 
    } 
    

    但是,請注意,有安全限制(如果攻擊者注入了「id」屬性或其他相關的屬性值,那些將被覆蓋)。

  2. 使用executeUpdate功能全,請參閱: http://www.grails.org/doc/latest/ref/Domain%20Classes/executeUpdate.html

    我認爲,如果你真的想保存的表現,那麼這樣下去。然而,你有一些硬編碼的DML,這將花費可維護性和靈活性。

+0

你可以做'jsonInstance'短,只需用'customerInstance.properties = jsonInstance作爲Map'或者,更安全,'customerInstance.properties =(jsonInstance如地圖).subMap([ 'allowedField',' anotherAllowedField'])'。 –

+0

如果你這樣做,你將失去'customerInstance'中設置的所有其他屬性,這些屬性在customerInstance上設置。這正是他不想要的,所以你必須將這些屬性合併到現有的屬性中。不是嗎? – Chris

+0

對不起,什麼「其他」屬性?這將只設置屬性jsonInstance包含 - 或者subMap()參數提及。 IIGIR不希望再次讀取對象,只更新已更改的屬性。這是對的,不能用GORM和HQL完成,並且完全繞過驗證。如果你的意思是嵌套屬性,兩種方式都會支持它們。 –