シリアル番号を生成するためにいくつかのコードを作成しています。私は生成する次の番号を保持するデータベースのレコードを読み込んで更新します。このレコードに別のスレッドがアクセスすることが予想されるため、同じエンティティのタイムスタンプフィールドに@Versionラベルを追加してから、上昇する可能性があるOptimisticLockExceptionsを制御します。@Versionがnullの場合のオプティミスティックロックエラー
また、異なるシリアル番号を持つデータベースにこれらのようなレコードがいくつかありますが、ビジネスによっては作成または削除できます。
ドメインオブジェクトは、次のようになります。すべてが正常に動作し
@Entity
@Table(name="Preferences")
public class Preferences implements Serializable, DomainObject {
...
...
@Column(name="nextSerial")
private String nextSerial;
@Version
@Column(name="RefreshDate")
private Timestamp refreshDate;
...
ここまでは、同じデータを共有する他のアプリケーションは、環境設定レコードを作成するとき、問題が来ます。このアプリケーションがビルドされると、@ Versionカラムは存在しなかったので、Null値を持つレコードをrefreshDateとして作成します。
私はこのことを認識していると私はrefreshDateを設定し、レコードを更新しようとし、また、レコードを削除して再度作成しようとしましたが、いずれにしても、私は次のような例外が発生します:
org.springframework.orm.jpa.JpaOptimisticLockingFailureException: 例外[EclipseLink-5001](Eclipse持続性サービス - 2.6.1.v20150916-55dc7c3):org.eclipse.persistence.exceptions.OptimisticLockException例外 説明:オブジェクト [[email protected]]を削除しますが、ID番号には という番号はありません地図。
私の質問は、アプリケーションからこの問題をどうやって処理できるのですか。 @Versionがnullでないことを保証するためにデータベース内のトリガーを使用することは望ましくなく、他のアプリケーションを変更することも望ましくありません。
おかげでdimirsen!私はすでにこれを行い、完璧に働いています。それでもJavaレベルでこれを処理する方法があれば、私は不思議でした。 –