2011-01-31 96 views
7

在我的服務類,我想有這樣的事情:休眠活動事務

class ClientService { 

    // Authorize 
    // Returns true: Authorization successful 
    // Returns false: Authorization failed 
    public boolean authorize(String id, String password) { 

    //Here I would like to check if an active transaction exists. 
    //If it exists, use that one, else create a new session and start 
    //a new transaction. 
    //For example: 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    if(!session.SOMEMETHOD_CHECK_IF_TRANSACTION_IS_ACTIVE) { 
    session.beginTransaction(); 
    } 

    Client client = clientDAO.get(id); 

    if (client != null) { 
    if (client.getPassword().equals(password)) { 
     logger.debug("Authorization successful. ID: " + client.getId() + ", password: " + client.getPassword()); 
     return true; 
    } else { 
     logger.error("Authorization unsuccessful"); 
     return false;  
    } else { 
     logger.debug("Authorization unsuccessful. No client exists with ID: " + id); 
     return false; 
    } 
    } 
} 

通知的方法頭後的註釋文本。我對Hibernate並不熟悉,但是我認爲如果服務方法檢查事務是否存在,使用它,否則創建一個新的並關閉它將會很好。

如果有可能,我是否應該考慮任何性能原因(或其他)?或者是否有任何其他方式來執行這種事情?

問候

回答

12

lweller的答案是比我的回答更合適的方法,但你可以通過調用session.getTransaction().isActive()

檢查事務的狀態

查看javadoc的Hibernate Transaction

+0

我認爲,session.getTransaction()肯定會返回一個活動的事務...所以不爲我工作(atlest)....是否有任何其他解決方案? – 2013-07-17 06:30:13

3

基本上你可以,因爲它是由Hibernate的JavaDoc的規定在任何情況下撥打session.beginTransaction();

開始工作的單位和返回相關的交易對象。如果需要新的基礎交易,請開始交易。否則,在現有基礎交易的上下文中繼續新工作。

但我會認真考慮TRANSATION管理框架的使用,像spring

+0

我完全同意。在我們工作的地方,他們不使用Spring,而是導致各種各樣的hibernate事務問題。 – blackpanther 2014-04-10 15:13:25