2011-07-19 52 views
0

我迄今捕獲MySQL特定的例外情況MySQLIntegrityConstraintViolationException等的迴避問題但現在我需要它來告訴他違反約束的用戶,應該選擇不同的字符串鍵。我試圖通過使用instanceof操作符來捕獲特定的異常,因爲Glassfish將它包裝在EJBException中。但迄今爲止我還沒有做到這一點。MySQL的陷阱中的異常Glassfish的

有沒有人有正確的代碼/模式來捕獲應用程序容器中的特定SQL異常作爲Glassfish?

最好的問候克里斯。

PS。我使用Glassfish的3.1和JPA 2.0

+0

您使用的是JPA嗎?或者其他一些框架/庫/ API? –

+0

@Vineet Reynolds:我用持久性庫信息更新了這篇文章。 – Chris

回答

1

對於大多數數據庫訪問框架,庫或API是不可能預測所有可能導致故障的情景。

在JPA中,映射到常見故障的API中有例外情況。大多數這些例外的是PersistenceException類的實例,或者它的子類,如EntityExistsExceptionEntityNotFoundExceptionNonUniqueResultException等,你能抓住這些特定的異常,併發出相應的錯誤消息。

您也可以使用Bean Validation API來驗證您的JPA實體在保留它們之前的狀態,以便您可以減少捕獲異常的可能性,這將需要不同的錯誤消息,並由最終用戶執行糾正操作。

+0

在違反約束的情況下,Persistence API中的標準異常(如果我理解正確的話)都不會出現。我總是可以做一個查找/檢查之前。但是我想盡量避免對數據庫進行大量額外的查詢,因爲這對於驗證約束的錯誤代碼來說是正常的。稍後再試一次。感謝您的重播。 – Chris

+0

@Chris,它取決於你定義的約束。對於主鍵衝突,將始終拋出「EntityExistsException」。如果你定義了其他約束,那麼你可能仍然會拋出'PersistenceException',其原因可能是'SQLException'。只要您知道SQL錯誤代碼與應用程序中違反條件​​的映射,您仍然可以繼續生成可供最終用戶讀取的消息。 –

+0

它不是主鍵或外鍵,只是唯一的約束。那麼會拋出一個EntityExistsException? – Chris