2012-02-08 13 views
1

beginTransactionメソッドをコールしようとすると、次のコードでNullポインター例外が発生します。私はJBossが私のトランザクションを開始すると思った...明らかにそうではない:\JBoss - ユーザートランザクションが挿入されていません

私は何が欠けていますか?

のJBoss 5.1.0.GA
JPA 1
JDK 6


 

import javax.annotation.Resource; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.PersistenceUnit; 
import javax.transaction.UserTransaction; 

public abstract class AbstractDAO { 
    @PersistenceUnit(unitName = "miniDS") 
    protected static EntityManagerFactory emf; 
    @Resource 
    protected UserTransaction t; 

    public AbstractDAO() { 

    } 

    protected void beginTransaction() throws Throwable { 
     t.begin(); 
    } 

    protected void commitTransaction() throws Throwable { 
     t.commit(); 
    } 

    protected void rollbackTransaction() throws Throwable { 
     t.rollback(); 
    } 
} 
 
+0

SpringのtransactionManagerを通じて、DAOを使用しているサービスで@Transactionalアノテーションを使用できます。 これは、トランザクションの開始/終了を自動的に処理します。 – bugske

答えて

3

あなたAbstractDAOが管理されていないようです。注入はコンテナ管理オブジェクトでのみ機能します。これは、UserTransactionの注入に固有のものではなく、一般的な注入である。結果としてemfもnullです。注入を使用できるようにクラスを次のJava EE仕様のリスト:

  • サーブレット:サーブレット、サーブレットフィルタ、イベントリスナー
  • JSP:タグハンドラ、タグライブラリのイベントリスナー
  • JSFは:
  • 管理対象Beanをスコープ
  • JAX-WS:サービスエンドポイント、ハンドラ
  • EJB
  • :豆、インターセプター
  • 管理Bean:管理対象Bean
  • CDI:CDIスタイルのマナGED豆、デコレータ
  • のJava EEプラットフォーム:メインクラス(静的)、ログインコールバックハンドラ

可能性のある問題を回避するには、マネージクラスにリソースの注入を移動したり、JNDIルックアップを使用することです。 AbstractDAOを拡張

2

あなたが永続ユニットを注入した場合、EntityManagerの通過トランザクションを取得しよう。詳細については

EntityManager entityManager = emf.createEntityManager(); 
entityManager.getTransaction().begin(); 

、ここを見て:https://github.com/wicketstuff/core/wiki/[email protected]

2

あなたの具象クラスConcreteDAOは、ミッコMaunuで言ったように、EJBであるべきで、それ自体が他の言葉でのトランザクション(トランザクションを管理豆そのものをBMT)、管理すべき:

@Stateless 
    @TransactionManagement(TransactionManagementType.BEAN) 
    public class ConcreteDAO extends AbstractDAO { 

    ... 

    } 

をそして、それは可能AbstractDAOにEntityManagerを挿入し、トランザクション(local-tx-datasourceまたはxa-datasource)を管理するようにJBOSSデータソースを設定する方がよいでしょう。 あなたは、JBOSS DSの設定を見ることができます:あなたがするEntityManagerを通じてトランザクションを自分で管理する場合のEntityManagerFactoryと、 https://community.jboss.org/wiki/ConfigDataSources

EntityManager entityManager = emf.createEntityManager(); 
    entityManager.getTransaction().begin(); 
あなたは何-TXないはずのUserTransactionとJBoss DSを使用することはできません

-datasource

関連する問題