私はこのテーマについて既にいくつか質問があることを知っていますが、これは異なると思います。JPAバージョンエンティティマージ
@Entity
public class foo{
@Id
@GeneratedValue
private long id;
@Version
private long version;
private String description;
...
}
彼らは、私はいくつかのオブジェクトを作成して)(JPAを追加使用してDBにそれらを持続:
のは、私はこのクラスを持っているとしましょう。
その後、JPA all()を使用してリポジトリからすべてを取得します。 そのリストから1つのオブジェクトを選択して説明を変更します。
次に、JPA merge()を使用してリポジトリ内のオブジェクトを更新したい(コードを参照)。
ここで問題となるのは、説明を変更しようとすると初めて問題になります(バージョン値は2になります)。 2回目に、オブジェクトが変更されたことを示すOptimisticLockExceptionが発生しました。
私はH2に埋め込みモードのDBを使用しています。
MERGEのCODE:
//First: persist is tried, if the object already exists, an exception is raised and then this code is executed
try {
tx = em.getTransaction();
tx.begin();
entity = em.merge(entity);
tx.commit();
} catch (PersistenceException pex) {
//Do stuff
}
間違っている可能性がありますか?
ありがとうございます。
EDIT(複数のコード)
// FooのBは「(JPAすべての()、次いで1つの目的は、そのリストから選択される
b.changeDescriptionを使用してDBから全てのオブジェクトを取得することにより得られます。新しい何か!");
//コールupdateメソッド(コードをマージすでに掲載)
があなたの代わりにマージのem.persistを試してみました:
はない場合、それにデフォルト値を追加してみてください
null
で動作するようになっていませんか?マージメソッドは、更新後にオブジェクトを追跡し続けます。設定がどのようになっているかに応じて、アップデートはすでにDBに送られている可能性があります。 – fhofmannさらにコードを投稿してください。エンティティを読み込んで変更する方法と、投稿したコードをどのように呼び出すかが関係します。 –
@AlanHay私の状況を表すいくつかのコードで元の投稿を編集しました –