web-dev-qa-db-ja.com

Spring-Dataプロジェクトで@Versionを使用する

私は春のデータを使用してRESTful Webサービスに取り組んできました。数日前に特別な春のデータjpa REST Framework リリースされました

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

また、@ Versionを独自に使用することはできますか? (既存のリポジトリ/ドメインなどを変更する必要がないように。)

また、@ Versionを使用するために追加の構成を行う必要がありますか?

31
Byron Voorbach

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

注釈@Versionはjavax.persistenceインターフェースであり、前に述べたようなSpring-Data Rest jpaフレームワークではありません。

@Versionを使用する場合は、次のようにドメインオブジェクトにバージョンフィールドを作成する必要があります。

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

Hibernateを使用している場合は、アノテーションが自動的に取得され、(私の場合はMySql)テーブルに「バージョン」行が作成されます。レコードが更新されるたびに、Hibernateはカウンターを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。行が更新された場合、それは正しいバージョンを提供したことを意味し、情報を要求してから変更して送信するまでの間に、他の誰もその特定の情報を変更していません。いいですね

行が更新されない場合はどうなりますか?これは、情報を要求した後、トイレの休憩中にあなたが他の誰かがその行を更新したことを意味します。それはあなたのバージョンが古いことを意味します!今何が必要かは実際にはユースケース固有なので、それについては詳しく説明しません:)

誰かがこの情報を使用できることを願っています!

皆さんありがとう

63
Byron Voorbach

必ずインポートjavax.persistence.Versionをインポートしてください

春のものではありません。

5
Byorn