68

JPA (transaction-type="JTA") を使用する 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

これはどのように発生し、どうすれば解決できますか?

4

5 に答える 5

229

EntityManager#remove()現在のトランザクション/コンテキストで管理されているエンティティでのみ機能します。あなたの場合、以前のトランザクションでエンティティを取得し、HTTP セッションに格納してから、別のトランザクション/コンテキストでエンティティを削除しようとしています。これはうまくいきません。

エンティティが管理されているかどうかを確認し、管理されEntityManager#contains()ていない場合は管理する必要がありEntityManager#merge()ます。

基本的に、delete()ビジネス サービス クラスのメソッドは次のようになります。

em.remove(em.contains(entity) ? entity : em.merge(entity));
于 2013-06-10T15:33:27.077 に答える