2013-11-04 96 views
2

從我的DAO方法中,我需要返回結果(即使發生異常)。我試圖以這樣的方式來做到這一點,它在異常情況下不起作用(我有個例外:don't flush the Session after an exception occurs)。DAO方法中的事務回滾

@Repository 
@Transactional(rollbackFor=HibernateException.class) 
public class UserDAO { 

    @Override 
    public boolean save(Proxy proxy) { 
     try{ 
      sessionFactory.getCurrentSession().save(proxy); 
     } 
     catch(HibernateException e){ 
      //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
      return false; 
     } 
     return true; 
    } 

} 

然而,當我取消//TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 所有作品像我期望的那樣。我知道文檔不建議使用這種方法,但註釋回滾不適用於我。你能解釋一下,爲什麼?如果可能,我可以修改代碼以使其工作嗎?

回答

4

只有當方法拋出異常時,Spring纔會回滾。如果它被拋出並被捕獲到該方法中,Spring並不知道異常,因此認爲一切正常,因此不會回滾事務。

因此,要麼保持對setRollbackOnly的調用,要麼更優選的是,不要使用布爾結果來指示操作成功或失敗。如果保存不成功,則應拋出例外

4

rollbackFor如果帶註釋的方法拋出指定的異常,則該屬性起作用。在你的情況下,異常在方法內部被捕獲並且不會傳播,所以rollbackFor不起作用。

1

如果你確實需要返回一個值而不是向你的調用者拋出一個異常,那麼你確實需要依賴setRollbackOnly(),我認爲這不是很糟糕,而是非常標準的方法。

此外,我認爲拋出一個異常是一個更好的主意,因爲當存在'錯誤'時,調用者沒有什麼錯誤的概念。否則,您可能需要返回錯誤代碼或錯誤消息或比「false」更有意義的內容。