2013-05-10 50 views
1

我正在嘗試創建一個事務性方法,該方法調用其他幾種事務性方法以保存一些相互依賴的數據庫實體。如果任何呼叫失敗,我希望事務完全回滾。但是,這不是觀察到的行爲。這裏是我的代碼:事務性方法回滾中的Hibernate事務方法調用

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) 
public void save(EntityToBeSaved entity) { 
    try{ 
      for(SubEntity sub: entity.getSubEntities()) //specifics omitted 
        saveSubEntity(sub); //this is transactional 
    } 
    catch (DataIntegrityViolationException e){ 
     throw new BusinessException("Duplicate Name"); 
    } 
} 

saveSubEntity也有Propagation.REQUIREDrollobackFor = Throwable.class,然而當交易在第二屆saveSubEntity調用失敗,第一subEntity將提交。

+0

非常令人驚訝。你能顯示'saveSubEntity()'的代碼嗎?另外,readOnly = false和propagation = REQUIRED是默認值。您可以刪除這些屬性。 – 2013-05-10 17:01:11

回答

0

顯然,問題是由於錯誤的Spring注入而產生的,因爲服務在啓動時沒有實例化,導致註釋無法正常工作。感謝您的幫助。

0

也許問題是Hibernate無法爲保存方法打開一個事務。

假設,如果Hibernate不爲保存方法創建的任何交易,那麼每saveSubEntity調用將在不同的事務,由於其Propagation.REQUIRED。因此,每次調用saveSubEntity時,每個都會被提交到數據庫。

要檢查交易是否爲創建節約方法還是不行,你可以幫我卸下saveSubEnitty方法Tranactional註解。如果沒有爲保存方法創建事務,您將會看到一個錯誤。

+0

你好,謝謝你的幫助。實際上,我放置了一個斷點,並且評估了TransactionAspectSupport.currentTransactionStatus(),它拋出了一個NoTransactionException異常,因此顯然父親不打開一個事務,即使它有Propagation.REQUIRED。任何想法爲什麼這可能是這種情況? – 2013-05-13 07:40:37

+0

因爲你使用的是基於**註解的Spring Transaction **,所以我猜你已經在應用程序上下文的Spring配置文件中聲明瞭標籤''。最後,你應該檢查標籤'',並確保具有** save **方法的bean必須位於** base-package **中。 – 2013-05-13 10:18:24

+0

是的,所有這些參數都是正確的,問題是顯式構造函數調用。 – 2013-05-14 10:24:45