2017-03-17 19 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是否允許你這樣做(通過默默地忽略回滾),但至少它是醜陋的。每個會話都應該被提交或回滾。