2016-04-04 1 views
0

Ich bin mit einigen alten Anwendungscode, und es scheint mehrere Konzepte beteiligt, so dass ich schauen, um sicherzustellen, dass ich sie zu einem festen und verbessern kann strenge Praxis.Hibernate-Transaktion starten/Rollback/commit vs. auch session.clear()

Grundsätzlich ist der gesamte Code mit einem HibernateSessionRequestFilter wie diese

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

} 

Dann gewickelt wird, gibt es einen Abfangjäger, so etwas wie diese

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

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

     // some logic 

     dbSession.getTransaction().rollback(); 

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

tut Und dann gibt es noch mehr Business-Logik-Code mit einigen weiteren Starttransaktionen und Sitzung löschen usw.

So, Fragen:

  1. Was passiert, wenn beginTransaction mehr als einmal in derselben Sitzung aufgerufen wird?
  2. Manchmal ruft "clear()" Ausnahme, ich denke, es passiert, nachdem ein "rollback()" aufgerufen wurde. Wie behebt man das?
  3. Im Allgemeinen, was ist die beste vorgeschlagene Praxis session.clear() mit Transaktion beginnen/Rollback/Commit kombinieren?

Danke

+0

Warum löschen Sie die Sitzung an erster Stelle? Was denkst du tut es? Warum setzen Sie die Transaktion zurück und binden sie nicht ein? Was denkst du tut es? Lesen Sie das Javadoc dieser Methoden und das [javadoc von beginTransaction] (https://docs.jboss.org/hibernate/orm/5.1/javadocs/org/hibernate/SharedSessionContract.html#beginTransaction--), das * * sagt ** was passiert, wenn es mehrmals in derselben Sitzung aufgerufen wird. Haben Sie https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#transactions-api gelesen, in denen die Verwendung von Transaktionen erläutert wird? –

Antwort

0

Ihr Code soll wie folgt aussehen und das ist Weg, um die Transaktion für die HTTP-Anforderung zu handhaben

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

} 

In anderen Teilen des Codes soll nicht den Begintrans Griff/close/Übernimmt die Transaktion. Es sollte nur an einer Stelle gehandhabt werden.