2012-01-27 36 views
3

我依靠數據庫告訴我是否存在違反唯一性的情況,所以我想知道何時發生的異常是某種違反約束的情況。它看起來像這正是我需要的:java.sql.SQLNonTransientException如何確定java中的數據庫約束違規?

但它是新的1.6,我不確定我的數據庫驅動程序是否足夠新。我使用了許多DBMS並擁有許多客戶端,因此依靠驅動程序更新是很困難的。

是否有一種通用的方法來檢查這個pre-java 1.6而不是搜索異常消息的「約束」?

回答

9

不,沒有一般的機制。這取決於您使用的數據庫和JDBC驅動程序。

SQLExceptiongetErrorCodegetSQLState返回可用於確定給定異常的良好含義的信息的方法,但您必須使其特定於驅動程序+數據庫。

Spring uses those same indications and a database-specific lookup table to translate SQLException into its own database-agnostic hierarchy of exceptions。你可以使用它,或者至少看看它的酸性代碼,看看它是如何工作的。

+0

感謝您的幫助,你說的是我預期的,即沒有供應商中立的方式來做到這一點。我可以用醜陋的方式處理它,我只是想看看它有多難看。再次感謝! – rjcarr 2012-01-27 08:30:31

1

一般來說:不要指望數據庫驅動程序總是返回'正確'的異常。這可能是更好地檢查:(!取決於驅動程序)

  • 的SQL狀態
  • 供應商代碼
  • 實際的消息文本
+1

我不會依賴消息文本,因爲某些(大多數?)驅動程序可能會根據客戶端的區域設置返回本地化的錯誤文本。 – 2012-01-27 08:27:16

+0

@a_horse_with_no_name你說得對(非常討厭本地化btw :) – 2012-01-27 09:06:42