2013-07-20 26 views
1

我在非EJB環境中使用Hibernate。我知道在使用EJB時​​有幾個Transation Annotations。但Hibernate Documentation似乎沒有討論所有這些情況。運行代碼使用休眠實現交易註釋功能

try { 
    factory.getCurrentSession().beginTransaction(); 

    // Do some work 
    factory.getCurrentSession().load(...); 
    factory.getCurrentSession().persist(...); 

    factory.getCurrentSession().getTransaction().commit(); 
} 
catch (RuntimeException e) { 
    factory.getCurrentSession().getTransaction().rollback(); 
    throw e; // or display error message 
} 
時,我想知道的是

會發生什麼已經有運行的交易?(請問一個新的事務創建或將現有的事務中使用。如果是後者我該怎麼辦實現前者,反之亦然?) 如何實現與使用Hibernate的不同EJB註釋相同的功能?

回答

2

The javadoc of beginTransaction()說:

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

而且the javadoc of commit()說:當且僅當底層的交易是由該對象發起

此方法將提交相關交易。

也就是說,在代碼中顯式管理事務和異常是一件痛苦的事情,並且會降低代碼的可讀性。我會用Spring在非EJB環境中解決這個問題。

+0

感謝您的回答。但正如你所說的那樣,「在現有的基礎事務的上下文中繼續新的工作」,Hibernate不可能實現與註釋REQUIRES_NEW相同的功能嗎? –

+0

這是:開一個新的會議。 –