1. ホーム
  2. java

[解決済み] Java - JPA - @Version アノテーション

2022-05-31 15:44:42

質問

どのように @Version アノテーションはJPAでどのように機能するのでしょうか?

様々な回答があり、その抜粋は以下の通りです。

JPAでは、データストアの同一レコードに対する同時修正を検出するために、エンティティのバージョンフィールドを使用します。JPAランタイムは同じレコードを同時に変更しようとしたことを検出すると、最後にコミットしようとしたトランザクションに対して例外をスローします。

しかし、どのように動作するのかまだよくわかりません。


また、以下の行からとして。

バージョンフィールドは不変と考えるべきです。フィールドの値を変更すると不定な結果になります。

ということは、バージョンフィールドを final ?

どのように解決するのですか?

<ブロッククオート

しかし、まだ私はそれがどのように動作するか分からないのですか?

例えば、あるエンティティ MyEntity がアノテーションされた version プロパティがあります。

@Entity
public class MyEntity implements Serializable {    

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Version
    private Long version;

    //...
}

更新時に @Version でアノテーションされたフィールドはインクリメントされ WHERE 節に追加されます。

UPDATE MYENTITY SET ..., VERSION = VERSION + 1 WHERE ((ID = ?) AND (VERSION = ?))

もし WHERE 節がレコードにマッチしない場合 (同じエンティティがすでに別のスレッドによって更新されているため)、 永続化プロバイダは OptimisticLockException .

バージョンフィールドをfinalとして宣言する必要があるということでしょうか。

いいえ、しかし、セッターを呼び出すことは想定されていないので、セッターをprotectedにすることを検討することができます。