2016-04-04 20 views
0

Bazı eski uygulama kodlarını kullanıyorum ve bazı kavramlar var gibi görünüyor, bu yüzden bunları tek bir katı haline getirebileceğimden emin olmak istiyorum. sıkı uygulama.Hazırda bekleme işlemine başlama/geri alma/taahhüt vs. de session.clear()

Temelde, bütün kod O zaman bu

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

} 

gibi HibernateSessionRequestFilter ile sarılır, bu

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

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

     // some logic 

     dbSession.getTransaction().rollback(); 

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

böyle bir şey yaptığını, bir avcı var Ve sonra daha da iş mantığı kodu vardır Daha fazla begintransactions ve session clear vs. ile birlikte

Sorularınız için:

  1. StartTransaction aynı oturumda birden çok kez çağrıldığında ne olur?
  2. Bazen, "clear()" ifadesini çağırmak istisna atar, sanırım "rollback()" çağrıldıktan sonra olur. Bunu nasıl düzeltebilirim?
  3. Genel olarak, session.clear() işlemini transaction begin/rollback/commit ile birleştirmek için önerilen en iyi uygulama hangisidir?

teşekkür ederiz

+0

İlk olarak oturum neden temizleniyor? Sence ne yapar? İşlemi neden geri alıyorsunuz ve işlemiyorsunuz? Sence ne yapar? Bu yöntemlerin javadoc'unu ve [beginTransaction] 'ın javadoc'unu okudunuz (https://docs.jboss.org/hibernate/orm/5.1/javadocs/org/hibernate/SharedSessionContract.html#beginTransaction--) * aynı oturumda birden çok kez çağrıldığında ne olduğunu söyler. İşlemleri nasıl kullanacağınızı açıklayan https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#transactions-api okudunuz mu? –

cevap

0

Kodunuz gibi görünmelidir ve bu tek http isteği için işlem işlemek için bir yoldur, BeginTransaction işlemez gerektiğini kodunuzun diğer bölgelerinde

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

} 

/İşlemi kapat/kapat. Sadece tek bir yerde ele alınmalıdır.

İlgili konular