2

これをネットで検索してみましたがだめでした。休止状態を使用してべき等更新を実行する方法はありますか。

ユース ケースの 1 つは、HTTP PUT を使用して、REST API を介してデータベース内の特定のフィールドを更新することです。たとえば、Id、Name、Phone、UpdateDateという列を持つデータベースがあり、(特定のIdの) Phoneフィールドを同じ値で複数回更新する場合、最初のアクションで電話を更新する必要があります(また、私の変更も変更します)。更新日)。その後の更新は、レコード (およびUpdateDate )に影響を与えてはなりません。

これは、最初にレコードを取得し、更新を実行する前に入力値と比較することで、アプリケーションに実装できます。Hibernateに組み込み機能があるかどうか疑問に思っていましたか?

4

1 に答える 1

3

休止状態で、オブジェクトを取得し、そのプロパティの1つを変更して、トランザクションをコミットしようとした場合。Hibernateは、新しい値を古い値と比較します。プロパティの少なくとも1つの新しい値が古い値と異なる場合にのみ、エンティティのすべての永続プロパティに対してUPDATEを発行します。

例:

  1. IDでEntityAを検索します。Hibernateはエンティティ(および遅延のない多対1エンティティ)に対してSELECTを発行し、元の値を記憶します。EntityA a = hibernateSession.find(EntityA.class, id);
  2. entityAにいくつかのプロパティを設定します。a.setPhone(newPhoneValue);
  3. トランザクションをコミットし、hibernateSession.flush().Hibernateをトリガーして新しい値を古い値と比較します。propertyBの古い値と新しい値が異なる場合、xのすべての永続プロパティに対してUPDATEを発行します。

次のような更新を発行します:UPDATE entityA set phone=?, name=?, updateDate=? WHERE id=?

必要に応じて、マッピングで動的更新動的挿入を使用できます。

dynamic-update(オプション-デフォルトはfalse):UPDATE SQLを実行時に生成し、値が変更された列のみを含めることができることを指定します。

dynamic-insert(オプション-デフォルトはfalse):INSERT SQLを実行時に生成し、値がnullでない列のみを含めるように指定します。

dynamic-updateをtrueに設定すると、Hibernateは変更されていないため、列UPDATEなしでを発行します。name

UPDATE entityA set phone=?, updateDate=? WHERE id=?

于 2011-08-26T23:08:57.677 に答える