0

JPAがエンティティの追加/更新を処理する方法と少し混乱しています。

ATM、私はこのコードを持っています:

AltContact c = new AltContact("test");
save(c)
System.out.println("ENTITY: " + contains(c));
c.setEnterpriseName("test2");
save(c);
System.out.println("ENTITY: " + contains(c));

saveメソッドは、EntityManagerでのマージを要求するアプリケーションのサーバー側の単純なメソッドです。

public void save (Object e) {
    em.merge(e);
    em.flush();
}

ここで、 emはのインスタンスですEntityManager

containsは、サーバー側のメソッドであり、特定のエンティティが現在の永続コンテキストに存在するかどうかをエンティティマネージャーに問い合わせます。

上記のコードは、テーブルに2つの行を作成します。最初の行の値は「test」で、もう1つの行の値は「test2」です。これは私が望むものではありません。

値が「test」の新しい行を作成し、行の作成直後にそれを更新して、値を「test2」に設定したいと思います。保存するための両方の呼び出しが2回返された後、containsの戻り値を印刷しました。false

問題は、保存を最初に呼び出した後、エンティティが永続コンテキストの一部ではないという事実に起因していると思います。そのため、もう一度save呼び出すと、エンティティマネージャーはそれを新しいエンティティと見なして新しい行を作成します。

この更新プロセスをどのように達成できますか?

4

1 に答える 1

1

いくつかのこと。最初に、インスタンスをシリアル化するために merge() を使用する必要があるのはなぜですか? また、その理由は何ですか? 永続化コンテキストから返されたオブジェクトを編集するだけであれば、マージや保存を行う必要はありません。

オブジェクトをシリアル化またはデタッチとして編集する必要がある場合、新しいオブジェクトの場合、保存からオブジェクトの Id を返す必要があります。これにより、デタッチされたオブジェクトが管理オブジェクトにリンクされます。理想的には、オブジェクトを編集する前に find() を実行してオブジェクトを取得します。

于 2012-11-05T14:59:40.260 に答える