2012-12-08 27 views
2

我有一個名爲add()的服務方法,它使用@Transactional註解。事務服務中的ConstraintViolationException沒有回滾

我把它稱爲它,但是當相應的DAO方法內發生ConstraintViolationException時,即使指定不了,它也會回滾事務。

我預計ConstraintViolationException被捕獲,而不是它NotFoundException檢查異常將被拋出。

@Override 
@Transactional(noRollbackFor = ConstraintViolationException.class) 
public User add(User user) throws NotFoundException { 
    try { 
     result = userDao.add(user); 
    } catch (RuntimeException e) { 
     throw new NotFoundException("Couldn't find group"); 
    } 
} 

有沒有辦法趕上ConstraintViolationException沒有事務回滾?

我使用spring 3.1.1和hibernate 3.6。

+0

您正在指定ConstraintViolationException不應該回滾。但是引發的異常是NotFoundException。由於它是一個檢查異常,因此默認情況下它不應該導致回滾*。但這一切都取決於你如何配置Spring事務管理器。 –

+0

我想捕獲ConstraintViolationException並拋出NotFoundException異常,但catch塊沒有捕獲它,我認爲它可能會在代理到達catch塊之前被捕獲,所以ConstraintViolationException上升並且事務回滾! –

回答

3

啊,我看到會發生什麼。 ConstraintViolationException發生在提交時,在方法執行後,當您的add()方法的事務攔截器嘗試提交事務時發生。由於它不能提交,顯然,事務被回滾。它不能做任何事情。

+0

謝謝你的回覆,是的,我認爲應該是這樣。 –