2011-02-22 79 views
4

我在下面使用Spring和JPA和HIbernate。拋出PersistenceException時,我想捕獲它並返回錯誤消息,以便它不傳播給調用者。在JPA + Spring中異常後回滾事務

@Transactional 
public String save(Object bean) { 
    String error = null; 

    try { 
     EntityManager entityManager = getEntityManager(); 

     for (int i = 0, n = entities.size(); i < n; i ++) { 
      entityManager.merge(entities.get(i)); 
     } 
    } 
    catch (PersistenceException e) { 
     error = e.getMessage(); 
    } 

    return error; 
} 

但我得到一個異常說javax.persistence.RollbackException: Transaction marked as rollbackOnly.我得到的交易需求異常後回滾,但我怎麼滾回來時,我逮住例外,不想再擲它?

回答

2

似乎沒有辦法回滾由Spring ORM管理的失敗事務。問題中顯示的代碼是一個服務類。將它的持久化例程提取到一個單獨的DAO類並讓服務類處理PersistenceExceptions就行了。

3

通過使用@Transactional如果在方法中拋出任何RuntimeException,它將自動執行回滾。你不需要手動去做。您可能根本不應捕獲該異常,而是讓它傳遞到更高級別的ExceptionHandler,它向用戶顯示一些標準錯誤頁面(而不是堆棧跟蹤)。你的方法也被標記爲void,但你返回一個字符串。

+0

謝謝,無效只是一個錯字,但我仍然得到RollbackException? – 2011-02-22 19:50:38

+1

如何刪除try和catch?國際海事組織沒有理由抓住和處理例外,因爲你無法「修復」它。 – 2011-02-22 19:53:24

0

在拋出異常的方法上使用@Transactional(noRollbackFor={PersistenceException.class})