我正在使用帶有 JPA 和 Hibernate 的 Spring Boot。我有一個具有唯一約束的表,因為我想避免多行。
在我的業務邏輯方法中,我必須保存多行,我想添加 ,@Transactional因為我需要回滾以防在某些保存期間發生某些錯誤。
對我來說,DataIntegrityViolationException(違反約束)不是錯誤,在這種情況下我想避免回滾(如果該行已經存在,我需要繼續保存其他行)。
我嘗試了多種解決方案只是為了設定我@Transactional在 DataIntegrityViolationException 的情況下跳過回滾(例如在這種情況下@Transactional(rollbackFor = Throwable.class, noRollbackFor = DataIntegrityViolationException.class)),但這不起作用,我收到:
UnexpectedRollbackException:事務靜默回滾,因為它已被標記為僅回滾
任何的想法?
uj5u.com熱心網友回復:
嘗試只DataIntegrityViolationException用 a包圍拋出例外的陳述句,try catch并在catch塊中列印錯誤,避免拋出DataIntegrityViolationException例外,然后回滾。
uj5u.com熱心網友回復:
@Transactional(noRollbackFor = DataIntegrityViolationException.class) 會作業,但你必須把它放在你的存盤庫方法上,而不是服務方法上。
public interface SomeRepo extends JpaRepository<_, _> {
@Transactional(noRollbackFor = DataIntegrityViolationException.class)
void someUpdate(...);
}
在您的情況下未發生回滾的原因是未標記為跳過這些型別的錯誤的事務代理拋出例外。
我寫了一篇關于這個細微差別的文章。也許,這將有助于澄清這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/372979.html
