2014-12-20 32 views
7

我怎麼能抓住這個異常:捕捉重複條目異常

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 
             Duplicate entry '22-85' for key 'ID_CONTACT' 
+2

這將是更好的解決,這是造成這個異常 – sol4me

+0

這不是一個問題,但如果一個Web應用程序的用戶可以更改HTTP請求參數的問題,我想確保每件事情都有效,所以我想添加這個圖層安全。 – Youssef

+0

但是,從堆棧跟蹤中可以看出,在插入期間,您違反了約束條件,最好在將數據發送到數據庫之前先驗證數據。你可以明顯地趕上異常,如果你真的想,但我希望有一個清潔的解決方案 – sol4me

回答

12

我用彈簧,所以我們通過org.springframework.dao.DataIntegrityViolationException

try { 
     ao_history_repository.save(new AoHistory(..)); 
    } 
    catch (DataIntegrityViolationException e) { 
     System.out.println("history already exist"); 
    } 
7

SQLIntegrityConstraintViolationException,如果你使用的是Java 1.6+

例如

try { 
    ps.executeUpdate("INSERT INTO ..."); 
} catch (SQLIntegrityConstraintViolationException e) { 
    // Duplicate entry 
} catch (SQLException e) { 
    // Other SQL Exception 
} 

try { 
    ps.executeUpdate("INSERT INTO ..."); 
} catch (SQLException e) { 
    if (e instanceof SQLIntegrityConstraintViolationException) { 
     // Duplicate entry 
    } else { 
     // Other SQL Exception 
    } 
} 
+0

'無法到達SQLIntegrityConstraintViolationException的catch塊。這個異常永遠不會從try語句body' – Youssef

+0

@Youssef中拋出,你的mysql-connector-java的版本是什麼?什麼是你嘗試更新的SQL? – auntyellow

+0

需要捕獲SQLException。然後,你可以發現,如果它是一個SQLIntegrityConstraintViolationException。需要注意的是MySQLIntegrityConstraintViolationException是一種SQLIntegrityConstraintViolationException的。 – auntyellow

0

下面的代碼工作對我來說解決這個問題:

try { 
    requete.executeUpdate(); 
} catch (final ConstraintViolationException e) { 

} 
0

我使用Spring。 所以趕org.springframework.dao.DuplicateKeyException

try{ 
    ... 
} catch (DuplicateKeyException dke) { 
    ... 
}