[解決済み] 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にすることを検討することができます。
関連
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
eclipse アクセス制限です。タイプ 'xxx' は API ではありません(必須ライブラリ '' の制限)。
-
Dateが型に解決できない問題を解決する
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
プロジェクトの依存関係を解決できなかった 解決
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
java 例外。Javaツールの初期化
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策
-
[解決済み] Spring-data-jpaを使用してエンティティを更新するにはどうすればよいですか?