2014-01-14 19 views
0

我有一個服務(Hibernate DAOs)從數據庫中檢索數據並將其返回給客戶端。其中一位開發人員在類中插入了@Transactional而沒有設置任何屬性。 spring的應用上下文中的bean聲明指定此服務是單例。春季單身人士課程事務 - 問題

現在的問題是,在調用這個服務中的多個方法時,spring是否仍然保持跨多個方法調用的會話活動?這會給我帶來什麼問題?這是一個好習慣嗎?下面的代碼片段。

@Transactional 
public class SomeService implements IService{ 

public TestObjects returnTestObj(){ 
    return testDao.findById(11); 
} 

public TestObjects returnAnotherTestObj(){ 
    //some processing in the session. 
    return testDao.findById(11); 
} 

} 

謝謝。

回答

1

由於@Transactional(和<tx:annotation-driven>或相應的Java配置),Spring將代理您的SomeService bean。這個代理將擁有交易行爲,即。打開Session,開始Transaction,提交或回滾Transaction,並關閉Session

在此服務的多方法被稱爲當過,莫非 春天仍保持會話跨多個方法主動呼叫

Session將繼續開放,直到方法返回。例如

SomeService service = ...// get bean 
service.returnTestObj(); // session boundary 
service.returnAnotherTestObj(); // other session boundary 

這是否給我帶來什麼問題?這是一個好習慣嗎?

你必須小心Hibernate代理和延遲加載。這不是好的或不好的做法,這取決於你想做什麼。它通過配置相對可定製。

1

長話短說@Transactional註解將導致Spring檢查一個事務是否在方法調用之前被打開 - 並根據設置打開新的/使用現有的 - 因此,你的代碼是免費的編程開放和交易交易。

通常,事務將在方法主體結束時關閉(comitted),但是如果調用者方法也被註釋了,那麼事務可能會繼續。

這是Spring面向方面編程特性的一部分。如果您想了解更多信息,您必須花時間閱讀手冊。