あなたが観察した問題は、データの同時変更の 1 つです。Hibernate には、これに対処するための多くの解決策があります。
基本的に、問題は 2 つのスレッド (またはクラスター内の 2 つのマシン) が同じデータに対して同時に動作していることです。次の例を検討してください。
machine 1: reads the data and returns it for editing somewhere else
machine 2: also reads the data for modification
machine 1: updates the data and commits.
machine 2: tries to do an update and commit.
2 番目のマシンがその変更をコミットしようとするとどうなりますか? Hibernate は、マシン 2 がデータを処理している間にデータが変更されたことを確認します。つまり、マシン 2 の更新は古いデータに基づいています。Hibernate は常に 2 つの変更をマージできるわけではありません (また、常に望ましい動作でもありません)。org.hibernate.StaleObjectStateException
上で述べたように、Hibernate はこの問題を解決するための多くのオプションを提供します。@Version
おそらく最も簡単なのは、データ オブジェクトを使用してバージョン フィールドを追加することです。Hibernate は、データの「バージョン」を自動的に維持します。更新が行われるたびに、バージョンは Hibernate によって自動的に変更されます。あなたの仕事は、データを読んでからデータを更新するまでの間にバージョンが変わっていないことを確認することです。それらが一致しない場合は、問題を処理するために何かを行うことができます (つまり、ユーザーに伝えます)。同時更新を防止するためのより洗練された手法がいくつかありますが、これが最も簡単です。