0

AJAX を介してフォームからレコードを更新しています。エンティティにマップする JSON オブジェクトがあり、コントローラー メソッドは次のとおりです。

@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);
}

オブジェクトの「id」フィールドでマージする既存のレコードが見つからなかった場合、 v.merge() が null を返すことをドキュメントから期待していました。その場合、それを新しい Vendor オブジェクトとして永続化したいと考えています。

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

ここでは POST メソッドに 2 つの役割を持たせていることは承知していますが、これは厳密には RESTful ではありません。理論的には、これは私にとってより簡単です (もちろん、そうではないことが判明しています)。

4

1 に答える 1

0

これはHibernateのことだと思います。Hibernate は、既に存在していることを認識していない場合、「マージ」しません。私が過去に行ったことは、ルックアップを行ってから永続化することだと思います。ワイヤーから入ってくるものをマージしようとすると、主キーの衝突または類似のものが発生すると思います。Hibernate には、既存のオブジェクトを作成または編集しているかどうかを示す何らかの「ダーティ」フラグが内部にあると思います。

raw-Hibernate でソフト ルックアップを実行する方法もありました。田畑"。オブジェクトをキャッシュにロードし、最初に SELECT を実行せずに更新を実行できるようにします。Spring には updateOrSave() もありますが、実際には SELECT を最初に実行します。

于 2012-03-19T18:51:22.367 に答える