2011-10-18 79 views
1

我無法理解爲什麼從Hibernate Validator 3.X升級到4.X後,我沒有再收到DataIntegrityViolationException。更新到Hibernate Validator 4後無法獲取Spring的DataIntegrityViolationException 4

不知何故Spring不能夠覆蓋持久層例外了。

除Validator依賴關係外沒有任何變化,但驗證違反驗證違規情況下不會通過DataIntegrityViolationException引發的測試。 我現在得到了一個javax.validation.ConstraintViolationException。

一切仍然存在,當然包括 但翻譯不再發生。

幫助歡迎!

回答

3

根據JPA-2.0規範,如果在類路徑中存在JSR-303驗證器實現(即Hibernate驗證器4.x),則在持久化實體之前會自動觸發JSR-303驗證。

因此,您的實體被Hibernate Validator拒絕,並且不會進入數據庫,因此不會違反數據庫完整性約束,並且不會拋出DataIntegrityViolationException,您將得到JSR-303的ConstraintViolationException

您可以通過添加

<validation-mode>NONE</validation-mode> 

persistence.xml禁用此默認行爲。

0

它打動了我的思想,但你是對的。

如果我關閉驗證,我仍然得到和,而不是得到DataIntegrityViolationException根源PropertyValueException「驗證」,我得到org.hibernate.exception.ConstraintViolationException,甚至沒有預期的javax.validation.ConstraintViolationException

因此,它看起來像有2種驗證啓用通過Hibernate驗證器。你似乎表明,新的Bean驗證默認啓用的是'pre database'。 但無論如何,無論有沒有<validation-mode>NONE</validation-mode>,我的日誌總是顯示查詢。可能是因爲Hibernate日誌記錄他們沒有將它傳送到數據庫,但我對真正發生的事情感到迷茫。

驗證沒有<validation-mode>NONE</validation-mode>和驗證之間有什麼區別。在文檔AFAIK中沒有發現任何關於此的內容。

相關問題