我對JPA相當陌生,並且希望找到處理JPA中的持久性異常的最佳實踐,比如說,可以解決可以解決的唯一約束違例問題由用戶。有很多關於如何編寫JPA應用程序的示例,但幾乎沒有關於如何處理由它們拋出的異常的示例。 :/如何處理和解析JPA持久性異常,以向用戶提供有意義的消息
例如註冊用戶,該人進入的電子郵件地址已經在由系統積極利用和得到一個約束違反:
try {
em.persist(credentials);
} catch (javax.persistence.PersistenceException ex) {
產生當添加重複的電子郵件此錯誤:
WARNING: SQL Error: 0, SQLState: 23505
SEVERE: ERROR: duplicate key value violates unique constraint "EMAIL_UQ_IDX"
Detail: Key (email)=([email protected]) already exists.
如何獲得有意義的答案給用戶?例如:Oops看起來像有人正在使用該電子郵件地址,你確定你以前沒有註冊過嗎?是否有內置的解析器,或者是否需要針對異常消息運行正則表達式(可能是一系列)if語句?
如果它在業務層上被捕獲,怎麼辦......將它踢到表示層的最佳實踐是什麼......就像我之前說過的那樣,這樣可以爲用戶。
增加對淨度: 正是這樣的人都知道,我有,有,而且我仍然在尋找各種不同類型的持久性的異常,這裏是一些研究,我一直在做我不」牛逼包括與我上面包括「try語句」例如:
try {
em.persist(credentials);
} catch (javax.persistence.PersistenceException ex) {
System.out.println("EXCEPTION CLASS NAME: " + ex.getClass().getName().toString());
System.out.println("THROWABLE CLASS NAME: " + ex.getCause().getClass().getName().toString());
Throwable th = ex.getCause();
System.out.println("THROWABLE INFO: " + th.getCause().toString());
Logger.getLogger(CredentialsControllerImpl.class
.getName()).log(Level.INFO, "Credentials Controller "
+ "persistence exception "
+ "EXCEPTION STRING: {0}", ex.toString());
Logger.getLogger(CredentialsControllerImpl.class
.getName()).log(Level.INFO, "Credentials Controller "
+ "persistence exception "
+ "THROWABLE MESSAGE: {0}", th.getMessage());
Logger.getLogger(CredentialsControllerImpl.class
.getName()).log(Level.INFO, "Credentials Controller "
+ "persistence exceptions "
+ "THROWABLE STRING: {0}", th.toString());
}
:)
的@Version註解能我們編輯消除競爭條件?它將如何工作?我曾想過按照你的建議檢查前線,但比賽狀況令我擔憂,現在仍然如此。正如你所說,機會很低;但這只是意味着它仍然會發生,儘管很少,所以仍然需要處理。我承認這是用戶需要參與的罕見用例之一,特別是如果您想允許用戶名和要求的電子郵件地址都必須是唯一的。 FWIW,我來自大量的世界(數據庫事務處理的K個百位數/秒),所以我得到了不必要的數據庫命中。 :) – BillR
此外,我想不用說,人們會拋出業務層中的持續性異常,直到表示層。當這樣的用戶可尋址約束錯誤發生時,就是(就像我們同意它即使很少......這意味着它會發生:D)。或者可能在所有情況下,表現層決定它要求用戶修復哪些內容,以及它會令人滿意,但是(對用戶)錯誤頁面令人沮喪。感謝您輸入的方式。 – BillR
@Version可以用於這裏的任何目的:這兩個線程會檢查一個電子郵件是否已經存在,兩者都不會找到它,並且都會嘗試插入。競爭條件最終將通過數據庫中的唯一約束來解決。在這種情況下,要麼向用戶顯示一條通用錯誤消息,要麼自動重試失敗的事務。重試有一個很好的機會(特別是如果你使用一個小的延遲之前)發現電子郵件存在,並將顯示一個有意義的錯誤信息給用戶。 –