JPA EntityManager を使用していくつかの操作を実行していますが、そのような操作の 1 つは、エンティティを同じ を持つ別のエンティティに置き換えてい@Id
ます。oldObject
とが与えられた場合、を削除してに置き換えるnewObject
最良の方法は何ですか?oldObject
newObject
動作しないコードを次に示します。
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 はそれが切り離されていると見なしています。例外が発生する理由はわかりましたが、解決策はまだ不明です。