2017-03-17 27 views
0

在我的项目下面的代码被用于管理Hibernate事务:Hibernate事务:这段代码的重点是什么?

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

他们告诉我这是为了确保连接已在方法的末尾正确关闭的完成。不过,我不明白在finally块中执行提交/回滚的重要性。

是否有真正的理由证明这种方法的正确性,还是更好地做一些简单的事情,就像这样?

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

回答

1

它应该是在尝试,有两个原因:

你会提交了会议,如果一些异常或超过HibernateException的其他错误,你几乎肯定不希望这样做

你会在调用回滚之后调用commit。我不记得Hibernate是否允许你这样做(通过默默地忽略回滚),但至少它是丑陋的。每个会话都应该被提交或回滚。