2009-05-05 81 views
2

我正在使用Spring並使用TransactionInterceptor透明地獲取Hibernate事務的程序。這使得非常方便的說「當這個方法從其他類中調用時,如果它不在一個事務中,則將它包裝在事務中。」獲取Spring類中的Hibernate事務

但是,我有一個類需要嘗試寫,並且必須立即找出它是否成功。儘管我想要兩種方法,但我希望有一種方法可以讓他們保持在同一個班級中,而不需要程序上明確地創建一個事務。實際上,我想是這樣的:

public void methodOne() { 
    //..do some stuff 
    try { 
     transactionalMethod();//won't do what I want 
    } catch(OptimisticLockingFailure e) { 
     //..recover 
    } 
} 

@Transactional 
public void transactionalMethod() { 
    //...do some stuff to database 
} 

不幸的是,我的理解是,這是行不通的,因爲我只是直接調用transactionalMethod。有沒有辦法讓Spring爲我調用本地方法並在需要時將其包裝在事務中,還是必須在另一個類中連接到此類?

回答

1

定義類實現的接口,其中transactionalMethod();使用依賴注入來將類的值設置爲它自己的實現;在你的bean工廠中,允許Spring在該接口實現中插入一個Around方面。這應該適合您的需求。

0

如果您希望transactionalMethod成爲自己事務的一部分,而不是簡單地加入已處於活動狀態的事務,則必須將傳播設置爲REQUIRES_NEW。像這樣

@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void transactionalMethod() { 
    //...do some stuff to database 
} 

您還應該檢查您的事務管理器是否支持這種傳播。這意味着transactionalMethos完全獨立於另一個被調用的事務,它也將完全獨立地提交/回滾。

相關問題