2016-04-04 79 views
0

我正在處理一些舊的應用程序代碼,並且似乎涉及到幾個概念,所以我期待確保我可以將它們改進爲一個實體嚴格的練習。hibernate transaction begin/rollback/commit vs. 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(); 
     } 
    } 
    } 

然後有更多的業務邏輯代碼與一些更begind交流和會話清除等

所以,問題:

  1. beginTransaction在同一會話上多次調用會發生什麼?
  2. 有時,調用「clear()」會拋出異常,我認爲它發生在「rollback()」被調用之後。如何解決這個問題?
  3. 一般來說,將session.clear()與transaction 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請求,

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(); 
    } 

} 

在你的代碼不應該處理的BeginTransaction其他地區/關閉/提交交易。它只能在一個地方處理。

相關問題