2

JSONを介して送信されたクライアントから取得したオブジェクトを保存する際の非常に基本的な質問があります。

クライアントに転送される顧客オブジェクトがあります。顧客を編集した後、Grailsに送り返され、データベースに保存する必要があります。パフォーマンスのために、私は完全な顧客オブジェクトをネットワーク経由で送信していません。

問題は、顧客オブジェクトを保存したい場合、Grailsはもちろん顧客オブジェクトの関係を検証して失敗することです。私は関係を送っていないので、これはOKです。

私の質問は、どうすればこの問題を解決できるかということです。顧客IDを使用してデータベースに再度クエリを実行し、編集したプロパティを更新する必要がありますか、それともより洗練された方法がありますか?オブジェクトを格納するたびにデータベースを読み取る必要があるため、データベースの観点からは少しコストがかかるように見えます。コードの観点からも、どのプロパティが設定されているかを確認して更新する必要があります。

ありがとうございました!

4

1 に答える 1

3

grailsは実際に更新するフィールドを推測できないため、部分的な更新を行うために使用することはできませんsave()。おそらく、フィールド値をNULLに設定したいので、Grailsはそれらのフィールドを無視することはできません。したがって、2つのオプションがあります。

  1. 説明したように実行します。DBからインスタンスをロードし、値を設定して、再度保存します。どのフィールドが更新されるかは気にせず、JSONインスタンスのすべての属性を取得したいだけだとおっしゃいました。したがって、すでに解析されたJSONインスタンスが呼び出されjsonInstance、顧客のデータベースバージョンがであると仮定するとcustomerInstance、次のことができます。

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

    ただし、セキュリティ上の制限があることに注意してください(攻撃者が「id」属性またはその他の関連する属性値を挿入すると、それらは単に上書きされます)。

  2. executeUpdate-functionを使用します。http://www.grails.org/doc/latest/ref/Domain%20Classes/executeUpdate.htmlを参照して ください

    本当にパフォーマンスを節約したいのなら、このようにしてください。ただし、ハードコードされたDMLがいくつかあるため、保守性と柔軟性が犠牲になります。

于 2011-08-15T11:55:57.163 に答える