2017-06-04 11 views
1

トランザクション管理を理解し、Struts 2、EJB 3およびHibernate 5.2で開発された既存のアプリケーションでその権限を使用しようとしています。私はそのトランザクション管理は、(私の場合は、EJBで)サービス層で行われる必要があります理解EJB 3.0および休止状態でのトランザクション管理

@Stateless 
    @TransactionManagement(TransactionManagementType.CONTAINER) 
    public class MyEJb implements ejbxyz { 

    @Override 
    public void method(){ 
      Dao dao=new Dao() //Dao class is simple java class 
      dao.fooMethod(); //this method updates some record 
      dao.barMethod(); // this method updates some other record 
     } 
    } 

    public class Dao{ 
     fooMethid(){ 
     Session session=sessFactory.openSession(); 
      session.beginTransaction(); 
     session.update(x); 
       } 
     barMethod(){ 
       try{ 
        Session session=sessFactory.getCurrentSession(); 
        session.getNamedQuery("xyz").executeUpdate(); 

       }catch(HibernateException ex){ 
        session.getTransaction.rollback(); 
       } 
      } 
      } 

以下のように は今、私は私のビジネス層でEJBを持っています。しかし、私はそこでこれをどのように達成することができますか? ?

barMethod()がレコードを更新できない場合は、fooMethodで行った変更をロールバックする必要があります。ですから、基本的には両方のメソッドを1つのトランザクションで処理する必要があります。 私はアプリケーションを実行すると、私はbarMethod内の任意のトランザクションを開始するわけではないので、それは以下の例外

Exception while barMethod getNamedQuery is not valid without active transaction 

そのをスローします。しかし、私は本当に新しいトランザクションを開始したくないし、fooMethodで開始された古いトランザクションを続行したいと考えています。

+0

あなたが言ったように:*トランザクション管理はサービス層*で行う必要があります。ステートレスなEJBを使用しているため、トランザクションを開始してコミットします。したがって、DAOメソッドのトランザクションを処理しないでください。トランザクションは、EJBコンテナによって自動的に処理されます。また、独自のHibernate APIを使用しないでください。 JPAを使用してください。 –

+0

@JBNizet「独自のHibernate APIを使用しないでください.JAを使用してください。 JPAの実装を休止していないのですか? –

+0

Java EEにはJPAという標準仕様があります。これは、標準インターフェース(EntityManager ...)、メソッド、注釈を定義します。 HibernateはJPAの実装です。独自のHibernate Session APIではなく、標準APIを使用する必要があります。 –

答えて

0

実際に、EJB Beanの場合、コンテナ管理のトランザクションはそのままの形でサポートされています。しかし、DaoクラスはマネージドBeanではありません。これは、あなたが手動でインスタンス化する通常のpojoです。したがって、他のejbによって開始されたトランザクションには参加しません。 Daoを別のファイルに移動し、@Statelessと注釈を付けて@EJB private Dao dao;
を使用してコメントを付けてください。ただし、Ejbコンテナにはさらにトランザクションがあります。コンテナがトランザクションに関してどのようにメソッドを呼び出すべきかを指定する@TransactionAttributeアノテーションを介して、メソッドレベルでトランザクションサポートを制御することができます。そうすることで、メソッドが独自のトランザクションを必要とするかどうか、あるいは呼び出し側が開始したトランザクションに参加するかどうか(たとえば、ejb Beanから呼び出されたときなど)を制御できます。詳細については、公式を見てくださいJava EE tutorial

+0

しかし、daoをejbとしてマークすると、コンテナのオーバーヘッドが増えると思いませんか?ただ興味があるだけ。 –

+0

現実には、あなたのDaoはあなたのMyEjbに繋がれています。MyEjbのインスタンスごとにDaoのインスタンスが1つあります。 Daoを専用Beanにすると、独自のプールがあり、MyEjbに注入されます。単一のマネージドBeanのオーバーヘッドはごくわずかで、サーバーは何百ものBeanに幸せに役立つことができます。ビジネスロジックに重点を置き、サーバーに任務を遂行させてください。パフォーマンスチューニングはまったく必要ありません。 – yntelectual