2016-04-04 10 views
0

私はいくつかの古いアプリケーションコードの取り扱い、および関連するいくつかの概念があるようですので、私は、私は固体の1にそれらを改善できることを確認するために探していますていますし、厳格な練習。取引を休止/ロールバックを開始/(もsession.clear対をコミット)

基本的には、全体のコードはその後、この

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    try { 
     sf.getCurrentSession().beginTransaction();    

     chain.doFilter(request, response); 

     sf.getCurrentSession().clear(); 

    } catch (...) {   
     //... 
    } finally { 
     sf.getCurrentSession().close(); 
    } 

} 

のようなHibernateSessionRequestFilterでラップされ、この

private String loadStaff(...) { 
    //... 

    try { 
     dbSession = //...; 
     dbSession.beginTransaction(); 

     // some logic 

     dbSession.getTransaction().rollback(); 

    } catch (RuntimeException e) { 
     //.. 
    } 
    finally { 
     if (dbSession != null && dbSession.isOpen()) { 
      dbSession.clear(); 
     } 
    } 
    } 

ようなものをやって、インターセプタがあり、その後、さらに多くのビジネス・ロジック・コードがありますいくつかのより多くのトランザクションとセッションのクリアなど。

したがって、質問:

  1. beginTransactionが同じセッションで複数回呼び出された場合はどうなりますか?
  2. 「clear()」を呼び出すと例外がスローされることがありますが、「ロールバック()」が呼び出された後に発生すると思います。それを修正するには?
  3. 一般的に、session.clear()とトランザクションbegin/rollback/commitを組み合わせるのに最適な方法は何ですか?

はありがとう

+0

なぜ最初にセッションをクリアしますか?それはどういうことだと思いますか?なぜトランザクションをロールバックし、コミットしないのですか?それはどういうことだと思いますか? *これは、あなたのそれらのメソッドのjavadocは、および[のbeginTransactionのjavadocを](https://docs.jboss.org/hibernate/orm/5.1/javadocs/org/hibernate/SharedSessionContract.html#beginTransaction--)を読みました*同じセッションで複数回呼び出されたときに何が起こるかを言う**。あなたは、トランザクションを使用する方法について説明している、https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#transactions-apiを読むことがありますか? –

答えて

0

あなたのコードは次のようになりますと、これは単一のHTTPリクエストのトランザクションを処理するための方法である、でBeginTransactionを扱うべきではありませんあなたのコードの他の部分で

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    try { 
     // Open the transaction. 
     sf.getCurrentSession().beginTransaction();    

     // Handle the request 
     chain.doFilter(request, response); 

     // Persist the db changes into database. 
     sf.getCurrentSession().commit(); 

    } catch (...) {   
     // Somthing gone wrong while handling the http request so we should remove all the changes and rollback the changes that are done in the current request. 
     sf.getCurrentSession().rollback() 
    } finally { 
     sf.getCurrentSession().close(); 
    } 

} 

/close /トランザクションをコミットします。 1つの場所でのみ処理する必要があります。