私は、プロバイダーとして JPA (transaction-type="JTA")、Hibernate を使用する Java EE プロジェクトを持っています。CRUD を処理するために Bean を記述します。プログラムは JBOSS 7 AS で実行されています。
EntityManagerDAO があります:
@Stateful
public class EntityManagerDao implements Serializable {
@PersistenceContext(unitName = "dtdJpa")
private EntityManager entityManager;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Object updateObject(Object object) {
object = entityManager.merge(object);
return object;
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void createObject(Object object) {
entityManager.persist(object);
}
public void refresh(Object object) {
entityManager.refresh(object);
}
public <T> T find(Class<T> clazz, Long id) {
return entityManager.find(clazz, id);
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void deleteObject(Object object) {
entityManager.remove(object);
}
}
しかし、 を呼び出すとdeleteObject
、この例外が発生します。
java.lang.IllegalArgumentException: 分離されたインスタンス com.test.User#5 を削除しています
これはなぜ発生し、どうすれば解決できるのでしょうか?
ベストアンサー1
EntityManager#remove()
現在のトランザクション/コンテキストで管理されているエンティティに対してのみ機能します。あなたの場合、以前のトランザクションでエンティティを取得し、それを HTTP セッションに保存してから、別のトランザクション/コンテキストで削除しようとしています。これは機能しません。
エンティティが管理されているかどうかを確認する必要がありますEntityManager#contains()
もしそうでない場合は、それを管理してくださいEntityManager#merge()
。
基本的に、delete()
ビジネス サービス クラスのメソッドは次のようになります。
em.remove(em.contains(entity) ? entity : em.merge(entity));