8

JPA EntityManager を使用していくつかの操作を実行していますが、そのような操作の 1 つは、エンティティを同じ を持つ別のエンティティに置き換えてい@Idます。oldObjectとが与えられた場合、を削除してに置き換えるnewObject最良の方法は何ですか?oldObjectnewObject

動作しないコードを次に示します。

try
{
    entityManager.getTransaction().begin();
    entityManager.remove(oldObject);
    entityManager.persist(newObject);
    entityManager.getTransaction().commit();
}
catch (PersistenceException persistExc)
{
    entityManager.getTransaction().rollback();
    // do some stuff
}

このコードは次の例外を受け取ります。

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.depressio.SomeObject
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1215)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1148)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1154)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:678)

もちろん、エンティティを削除する代わりに、変更されたフィールドを更新するだけで問題なく動作します。ただし、私は新しいオブジェクトを与えられているだけなので (UI は REST 経由でそれを投げかけています)、どのフィールドが変更されたのかまったくわかりません。そのため、すべてのフィールドを更新する必要があります。大量のフィールドがある場合、それは理想的ではありません。

実際に削除を適切に行う方法について、少し混乱していると思います。EntityManager.remove正しい方法だと思っていましたが、そうではありませんでした。

前もって感謝します!

編集 1: oldObject.id == newObject.id に注意する必要があると思います。はidを通じて生成されます@SequenceGenerator。オブジェクトの識別子に既にジェネレーターの注釈が付けられている場合、オブジェクトを識別子で永続化することはできますか?

編集 2:ここで最も支持された回答によると、@Idは既に定義されており、自動生成されたフィールドであるため、Hibernate はそれが切り離されていると見なしています。例外が発生する理由はわかりましたが、解決策はまだ不明です。

4

1 に答える 1

7

それEntityManager.merge()がそうです。新しい切り離されたエンティティを渡すと、その状態が古い接続されたエンティティにマージされます。分離されたエンティティは分離されたままになり、古いエンティティは結合されたままになりますが、その状態は新しい分離されたエンティティの状態に置き換えられます。

于 2013-05-31T22:13:08.430 に答える