2017-05-30 14 views
0

では正常に動作していない @Versionアノテーションは、私は基本エンティティクラスに持ってJPA/EclipseLinkの

JPAは自動的に値をインクリメントしますバージョン属性@、ようフィールド(タイムスタンプ)の1が持っている

ただし、タイムスタンプの値が更新されず、編集された日付が作成された日付よりも小さい場合もありますが、これは理論的には起こりません。

編集済みの値をプログラムで設定していません。ここで

は私のエンティティクラスである:

public class BaseEntity implements Serializable { 

@Column(name = "CREATED") 
private Timestamp created; 

@Column(name = "EDITED") 
@Version 
private Timestamp edited; 

// other fields, getters and setters 

} 

この@Versionアノテーションについての多くの記事を読みましたが、この値は更新されませんなぜ私は理解していない、この背後にある理由は何ですか。

いくつかのいずれかが私を助けている場合は、素晴らしいことだ。ここ

おかげ

+0

トランザクションがコミット(またはフラッシュが呼び出された後)された後、マネージエンティティの値が変更されていることを確認します。よくある間違いは、JPAがDBに行く直前に値を更新するだけなので、分離されたエンティティの値を調べるか、またはトランザクションがデータベースに同期する前に調べることです。それ以外の場合は、問題が表示されていないことを示す状況と、それが表示されない状況に関する詳細情報を提供します。 – Chris

答えて

1

は、いくつかの基本的な注意事項は次のとおりです。あなたが右のパッケージjavax.persistence.Versionをインポートした場合

  • チェック。
  • すでに保持されているエンティティに変更を保存するときは、obj = entityManager.merge(obj);を使用します。
  • バージョンフィールドの値を手動で変更しないでください。エンティティマネージャがそれを処理します。
  • さらにデバッグ編集ご persitence.xmlについては

およびプロパティに次の行を追加します

<property name="eclipselink.logging.level" value="FINE"/> 
<property name="eclipselink.logging.parameters" value="true"/> 
<property name="eclipselink.logging.sql.level" value="FINE"/> 

これは細かいログを有効にすると、出力の多くを生成します。更新クエリと正確に何が起こっているかを見ることができます。

+0

こんにちは@XiCoN JFS、 答えがありがたいですが、20〜50件近くのレコードをチェックしてもうまくいきますが、失敗するケースもあります。 ログステートメントを見ると、タイムスタンプ値を更新するための正しいパラメータがあります。 私は更新されたエンティティのみを使用しています。 –

+0

私は個人的にこのような問題に遭遇したことはありません。あなたは 'merge'関数を編集して戻り値を評価してください。期待値でない場合は、オブジェクトの 'System.out.println(obj)'を作成します。このようにして、実際に起こったことをより詳しく見ることができます。また、実際に何もこのフィールドの値を操作していないかどうかを見るために、プロジェクト内の 'edited'フィールド(getterと実際のフィールド)の用途を調べることも考えられます。 –

関連する問題