2017-03-17 3 views
0

Dans mon projet, le code suivant est utilisé pour gérer les transactions de mise en veille prolongée:Transaction Hibernate: quel est le but de ce code?

public void someMethod() { 
    Session session = HibernateSessionFactory.getSession(); 
    Transaction tx = session.beginTransaction(); 
    try { 
     session.save(something); 
    } catch (Exception e) { 
     tx.rollback(); 
     logger.error("error", e); 
     throw new EJBException(e); 
    } finally { 
     try { 
      tx.commit(); 
     } catch (Exception e) { 
      tx.rollback(); 
      logger.error("error", e); 
     } finally { 
      session.close(); 
     } 
    } 
} 

On m'a dit que cela est fait pour assurer que la connexion a été correctement fermée à la fin de la méthode. Cependant, je ne comprends pas le point de faire le commit/rollback dans le bloc finally.

Y at-il une vraie raison qui justifie cette approche, ou est-il préférable de faire quelque chose de plus simple, comme cela?

public void simplerMethod() { 
    Session session = HibernateSessionFactory.getSession(); 
    Transaction tx = session.beginTransaction(); 
    try { 
     session.save(something); 
     tx.commit(); 
    } catch (Exception e) { 
     tx.rollback(); 
     logger.error("error", e); 
     throw new EJBException(e); 
    } finally { 
     session.close(); 
    } 
} 

Répondre

1

Il devrait être essayer, pour deux raisons:

Vous commettez la session si une exception ou une erreur autre qu'une HibernateException, et vous certainement ne veulent pas faire

Vous appelez commit après l'annulation de l'appel. Je ne peux pas me souvenir si Hibernate vous permet de faire cela (en ignorant silencieusement la restauration) mais à tout le moins c'est moche. Chaque session doit être validée ou annulée.