2

次のシナリオがあります。

  1. 取引開始
  2. person.getVersion() --> 0 を返す
  3. person.setName("汚い");
  4. session.save(人);
  5. person.getVersion() --> 0 を返す
  6. session.flush()
  7. person.getVersion() --> 1 を返す
  8. トランザクションコミット

ステップ 4 で、実際にセッション フラッシュまたはトランザクション コミットを強制せずに、更新されたバージョンを取得するにはどうすればよいですか?

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

4

1 に答える 1

3

非常に簡単: する

person.getVersion() + 1

笑顔ですか?しかし、これはまさに hibernate が version プロパティで行っていることです。

データベースへの更新時に、hibernate はデータベースからレコードをリロードし、バージョン値を Java オブジェクトのバージョン値と比較します。それらが同じである場合、hibernate はバージョン値を 1 つ増やし、新しいレコードをデータベースに保存します。そうでない場合、例外をスローします。その間に他のアプリケーションがレコードを変更した場合、変更された値を上書きしてはならず、アプリケーションはデータを再読み込みして新しい値を変更する必要があります。

確かに、Java オブジェクトの値が変更されたときに、最初に hibernate がバージョン値を変更する可能性があります。ただし、値が変更されるたびに、hibernate はオブジェクトが変更されているかどうかを確認する必要があり (新しい値は古い値と同じである可能性があります。この場合、更新は必要ありません)、バージョン値が既に変更されているかどうかをマークする必要があります。増加するかどうか。何も勝てないのに、なぜこれをするのですか?

ところで、hibernate は save() の瞬間にデータベース レコードを更新するのではなく、flush() または commit() の瞬間に更新します。これにより、パフォーマンスを向上させるためにデータベース ステートメントの順序を変更できるからです。

于 2012-04-04T14:46:39.393 に答える