2016-11-21 16 views
0

私はトランザクション制御が手動で行われるコードを持っています しかし、このコードは、トランザクションが手動で制御されない同じアプリケーションの他のEJBのメソッドを呼び出します。たとえば、Hibernate Sessionを使用するメソッドコンテナによって管理されます。手動管理トランザクション

たとえば、Session.createCriteriaを使用してクエリメソッドがある場合、手動で管理されたトランザクションがコミットをダウンロードしないようにする方法。

これが発生すると、プロセスは実際にプロセスが完了する前にコミットをアンロードします。

private void exe() throws Exception { 
    @EJB Businessbusiness; 
     this.beginTransaction(); 
      business.processar(); // Exemplo 
     this.commit(); 
    } 


@Stateless 
public class Business() { 
    @EJB 
    private DAO dao; 

    private void processar() throws Exception { 
    // executando processo 1 
     this.save(); 

     // executando processo 2 
     this.update(); 

     // Saving and updating has not yet been committed. So far it is correct. 

    Teste = dao.buscarTeste(1L); 

    // Here, after performing the search, my transaction downloads the commit to the bank without completing the whole process. 
    } 
} 

@Stateless 
public class DAO() { 
    public Teste buscarTeste(Long codigo) { 

     Criteria cri = getSession().createCriteria(Teste.class); 

     cri.add(Restrictions.eq("codigo", codigo)); 

     return (Teste) cri.uniqueResult(); 
    } 
} 

答えて

0

私は実際にあなたのポイントを得たことを確認していません。

しかし、エラーが発生していないと仮定すると、Business.processar()メソッドを呼び出すと、トランザクションが継承されます。 exeクライアントがコミットするまで「保留中」のままです。

あなたのgetSession()が真ん中で行っていることを調査すると、コミットされていないデータを取得する新しいトランザクションが開始されることは間違いありません。

ところで、具体的な実装として休止状態でJPAの代わりにハイバネートを使用する理由はありますか?

+0

これは会社自身のフレームワークのデフォルトですが、getSessionはアクセスできない場所にカプセル化されています。あなたの反応をありがとう、レオナルド、私は本当にこの動作を理解していません。 – EdeGerSil

+0

Uhm ...この場合、唯一の受け入れ可能な理由は、DAOがまったく新しい取引を開始しているということです。 – Leonardo

+0

ありがとうございましたLeonardo – EdeGerSil

関連する問題