14

私はバネデータ付きのRESTful Webサービスを開発してきました。数日前に特別なスプリングデータjpa RESTフレームワークwas releasedバネデータプロジェクトで@Versionを使用する

今、私はこのフレームワークで@Versionを使用できることに気付きました。このバージョンは単独で生成されるのですか、手動で行う必要がありますか?

それに@Versionを使用することは可能ですか? (既存のリポジトリ/ドメインなどに何も変更する必要はありません)

@Versionを使用するには、いくつかの追加設定が必要ですか?

答えて

34

私はこの質問を投稿してからしばらくしていますが、わかりました。他の人に役立つように私がしたことを説明します。

注釈@Versionはjavax.persistenceインターフェイスであり、前に述べたspring-data rest jpaフレームワークではありません。

あなたは@Versionを利用したい場合は、そのようなあなたのドメインオブジェクト内のバージョンフィールドを作成する必要があります:あなたはそれを自動的にピックアップ注釈休止状態にし、それが作成されます使用している場合

@Version 
@Column(name = "VERSION") 
private long version; 

あなたの(私の場合はMySql)テーブルの "バージョン"の行。レコードが更新されるたびに、休止状態は1でカウンタをインクリメントします。

これはなぜ必要なのですか?あなたがこれを使用したい理由は、クライアントがstale dataで働いている可能性が減るからです。クライアントがあなたから情報を取得するたびに、彼は要求されたデータをバージョンに提供します。例えば

{      <-- School entity --> 
    "id": 1, 
    "version": 0,     
    "name": "De regenboog", 
    "street": "Plantaanstraat", 
    "number": "2", 
    "zipCode": "1234AS", 
    "city": "Amsterdam" 
} 

クライアントがこの特定のレコードに関する情報を変更したい場合、新しい情報とバージョン値を送信します。この場合、学校の名前を変更しましょう。

{      <-- School entity --> 
    "id": 1, 
    "version": 0,     
    "name": "Stackoverflow", 
    "street": "Plantaanstraat", 
    "number": "2", 
    "zipCode": "1234AS", 
    "city": "Amsterdam" 
} 

Hibernateはあなたの情報を含むクエリを作成し、追加の 'where'節を追加してバージョンを確認します。 update .... where id = 1 and version = 0。行が更新された場合は、正しいバージョンを提供したことを意味し、情報を要求した時点から変更した時点までに特定の情報が変更されたことはありません。いい?

行が更新されない場合はどうなりますか?あなたが情報を要求した後、あなたが素早いバスルームで休憩している間に、誰かがその列を更新したということです。あなたのバージョンは古くなっています!今起こる必要があるのはユースケース固有のものなので、詳細については触れません:)

誰かがこの情報を使用したいと思っています!

おかげで、すべての

+0

私は確かに私を助けました。ありがとう – kalz

1

輸入javax.persistence.Version

としないばね1をインポートすることを確認します。

+0

私はすでに私の答えにそれを追加しました。「@Versionアノテーションはjavax.persistenceインターフェイスであり、前にも触れたようにspring-data rest jpaフレームワークではありません。 –

+1

注意の理由には重要です。Spring @Versionアノテーションは、JPAを除くすべてのものです。 http://stackoverflow.com/a/31883006/328808を参照してください。 –

関連する問題