7

JBoss 5.0.1GA で JSF アプリケーションをセットアップして、テーブルにユーザーのリストを表示し、各ユーザーの横にあるボタンを使用して個々のユーザーを削除できるようにしました。

deleteUser が呼び出されると、JBoss から注入された EntityManager を取得する UserDAOBean に呼び出しが渡されます。

私はコードを使用しています

public void delete(E entity)
{
    em.remove(em.merge(entity));
}

ユーザーを削除します (コードは JPA チュートリアルの c&p でした)。em.remove(entity) を呼び出すだけでは効果がなく、同じ例外が発生します。

この行に到達すると、TransactionRequiredException が発生します。

(明らかに無関係なスタックトレースのものをスキップします)

...

20:38:06,406 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet throwed exception javax.persistence.TransactionRequiredException: EntityManager must be access within a transaction at org.jboss.jpa.deployment.ManagedEntityManagerFactory.verifyInTx(ManagedEntityManagerFactory) .java:155) org.jboss.jpa.tx.TransactionScopedEntityManager.merge(TransactionScopedEntityManager.java:192) at.fhj.itm.utils.DAOImplTemplate.delete(DAOImplTemplate.java:54) at.fhj.itm. UserBean.delete(UserBean.java:53) at sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブ メソッド)

...

すでに手動で管理されたトランザクション (em.getTransaction().begin() + .commit() ) をラップしようとしましたが、JBoss コンテナー内で許可されていないため失敗しました。UserTransaction でも成功しませんでした。この問題を Web で検索しても、同様のケースと解決策は見つかりませんでした。

誰かが以前に似たようなことを経験し、これに対する解決策を見つけましたか?

4

4 に答える 4

8

ミッシングリンクを見つけました。

これは確かに欠落したトランザクションでしたが、解決策は EntityManager を使用してそれを処理するのではなく、注入された UserTransaction を追加することでした。

@Resource
UserTransaction ut;
...
public void delete(E entity)
{
        ut.begin();
        em.remove(em.merge(entity));
        ut.commit();
}

何とか100以上のコーナーがこの解決策につながるすべての提案に感謝します.

于 2009-07-07T14:45:22.880 に答える
2

これは古い質問ですが、私のように誰かがこれに出くわした場合に備えて.

試す

em.joinTransaction();
em.remove(bean);
em.flush();

これは、すべての @Stateful Bean で使用するものです。

Seam を使用している場合は、@Transactional(TransactionPropagationType.REQUIRED)アノテーションも使用できます。

于 2010-01-07T23:04:33.117 に答える
1

Beanに@Statelessで注釈を付けたり、xmlに登録したりしますか?

コードにトランザクションのアノテーションを追加してみてください。これは次のことに役立ちます。

@TransactionAttribute(REQUIRED)
public void delete(E entity)
{
        em.remove(em.merge(entity));
}

ただし、明示的に設定しない場合はデフォルト値であるため、奇妙に思えます。

于 2009-07-05T22:30:45.500 に答える
0

注記: 今日、同じ問題に遭遇しました。誰かが EJB を TransactionAttributeType.NOT_SUPPORTED としてマークし、メソッドを TransactionAttributeType.REQUIRED としてマークしたため、トランザクションがないために em.merge が失敗したことが判明しました。

于 2015-10-01T10:53:21.753 に答える