休止状態の xml (レガシー システム) を含むいくつかのオブジェクトがあります。
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="increment" />
</id>
<timestamp name="lastModifiedOn" column="last_modified_on" />
...
サーブレットでは、オブジェクトが追加および更新されます。postgresql を使用すると、サーブレットが機能し、例外はスローされません。MSSQL を使用して、1 人のユーザーのみがサーブレットにアクセスしている場合、行が別のトランザクションによって更新または削除されたことを示す staleobjectstate 例外がスローされます。
Hibernate SQL は、サーブレットで独自に更新ステートメントを発行することを示しました。明示的に hibernate の update メソッドが呼び出されると、エラーがスローされます。
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
奇妙な部分は、オブジェクトを更新するためのSQLが次のとおりであることです。
update
equipment
set
last_modified_on=?,
created_on=?,
public_id=?,
vendor_id=?,
created_by=?,
last_modified_by=?,
equipment_id=?
where
ID=?
and last_modified_on=?
IDに基づいてチェックし、最後に変更したのは何ですか?なぜIDだけではないのですか?IDフィールドのみがdbのPKです。サーブレットにアクセスしているユーザーは 1 人だけです。
今のところ、システム全体で最終更新日をタイムスタンプからプロパティに変更したところ、エラーはなくなりました。また、休止状態によって生成される sql は、ID に基づいてのみチェックするようになりました。
<timestamp name="lastModifiedOn" column="last_modified_on" />
に
<property type="timestamp" name="lastModifiedOn" column="last_modified_on" />
ただし、現在、db (datetime) のフィールド last_modified_on は最新の時刻で自動的に更新されず、null が含まれているため、インターセプトがあってもこの変更を行うにはプログラムで行う必要があります。
lastModifiedOn をタイムスタンプとして引き続き使用し、その古いオブジェクト状態の例外を取り除く方法はありますか?