2017-12-01 9 views
1

シリアル番号を生成するためにいくつかのコードを作成しています。私は生成する次の番号を保持するデータベースのレコードを読み込んで更新します。このレコードに別のスレッドがアクセスすることが予想されるため、同じエンティティのタイムスタンプフィールドに@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でないことを保証するためにデータベース内のトリガーを使用することは望ましくなく、他のアプリケーションを変更することも望ましくありません。

答えて

1

作成時にDB手段を使用してrefreshDateのデフォルト値を設定できますか?同様

VERSION BIGINT NOT NULL DEFAULT 1 - 数値バージョンのための

RefreshDate今TIMESTAMP NOT NULL DEFAULT() - あなたのケースのために

+0

おかげでdimirsen!私はすでにこれを行い、完璧に働いています。それでもJavaレベルでこれを処理する方法があれば、私は不思議でした。 –

関連する問題