2015-09-09 20 views
2

我在閱讀有關使用JPA時的rollbackFor屬性。即使我嘗試捕獲,Spring Data中的rollbackFor屬性是否也能工作?

現在我的代碼是這樣

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 
    public void newUser(User user) { 
     try{ 
      userRepository.saveAndFlush(user); 
     }catch(Exception e){ 
      //log exception 
     } 
     return; 
    } 

據我所知,的rollbackFor將工作異常時被捕獲...這是正確的方式做到這一點?或者嘗試抓住不應該在那裏?

謝謝。

+0

'Transactional'是一個Spring註解,而不是一個JPA註解。 –

+1

我無法想象當annotated方法捕獲異常時'@Transactional'註釋可能會如何影響行爲。因此,我傾向於假設'rollbackFor'屬性是關於註釋方法拋出*(直接或間接)的異常。 –

回答

2

事務註釋的rollbackFor: 定義爲零(0)或更多的異常類,它必須是Throwable的的子類,指示哪個異常類型必須導致一個事務回滾。

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html#rollbackFor--

另外,我們不應該壓制/吃事務方法中的異常,而我們需要從方法出來拋出異常,以回滾數據庫事務:

請在下面找到合適的實現:

 @Transactional(readOnly = false, 
     propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 
     public void newUser(User user) throws Exception { 
     try{ 
      userRepository.saveAndFlush(user); 
     } catch(Exception e){ 
      throw new Exception("Unable to Save User Object ",e); 
     } 
    } 

你ç一個還參考以下鏈接處理的事務註釋例外:

Best practices for rolling back transactions in Spring 3/Hibernate

+0

在這種情況下使用異常鏈接非常可取,這樣原始異常的性質和上下文不會丟失:拋出新異常(「無法保存用戶對象」,e);'。 –

+0

拋出(也可能聲明)比'Exception'更特定的異常也會更好。 –

+0

同意您的意見。 – developer

相關問題