2011-12-21 11 views
0

AJAXを介してフォームからレコードを更新しています。私は私のエンティティにマップするJSONオブジェクトを持っている、と私のコントローラメソッドは次のようになります。それは、オブジェクトのことで、既存のレコードが見つからなかったSpring JSON merge

@RequestMapping(value = "/vendors", method = RequestMethod.POST) 
public ResponseEntity<String> saveVendorsJson(@RequestParam String vendor) { 
    Vendor v = Vendor.fromJsonToVendor(vendor); 

    if (v.merge() == null) { 
     v.persist(); 
    } 
    return new ResponseEntity<String>(HttpStatus.OK); 
} 

は、私はnullを返します(v.mergeドキュメント)から期待されます'id'フィールドをマージしてください。その場合は、新しいVendorオブジェクトとして永続化します。

私のJSONが既存のレコードと一致する「id」フィールド値を持っているにもかかわらず、ブラウザから更新された商品で新しいレコードを挿入しようとしています。

ここで私はPOSTメソッドをダブルデューティにしていますが、これは厳密にはRESTfulではありません。理論的には、これは私の方が簡単です(当然のことではありません)。

+0

私は 'Vendor'は' .merge() 'と' .persist() 'を実装するものを拡張するカスタムクラスだと仮定しますか?あなたが言及している実装クラスと「ドキュメンテーション」は何ですか?上記のことが正確であれば、すべて正しいと思われ、うまくいくはずです。 –

+0

ベンダーは、Spring-Rooアノテーション '@ RooEntity'によってモデル化されたPOJOです。これは' persist() 'メソッドの由来です。 –

+0

私が作業しているドキュメントは[here](http://static.springsource.org/spring-roo/reference/html/base-json.html)で、文字列 "merge"を検索します。 –

答えて

0

これは休止状態だと思います。 Hibernateは、それが既に存在しているかどうかわからない場合、 "マージ"しません。過去に私がやったことは、ルックアップを行い、それから永続することだと思います。私はあなたがプライマリ・キー・コリジョン、あるいはそれに類するものを得るためにワイヤーから入ってくるものをマージしようとすると思います。私は、既存のオブジェクトを作成したり編集しているかどうかを示すために、Hibernateが何らかの「汚い」フラグを内部に持っていると信じています。

また、元のHibernateでソフトルックアップを行う方法がありましたが、基本的にHibernateに "見て、私はこのオブジェクトを持っています。私はSELECTをやりたくありません。いくつかのフィールドを更新したい "。オブジェクトをキャッシュにロードし、SELECTを最初に実行せずに更新を実行できるようにします。 SpringにはupdateOrSave()もありますが、実際にはSELECTが最初に実行されます。