2011-09-29 25 views
3

阿羅哈嘿!JSR-303和JPA重疊

我已經使用JPA註解,現在我想使用JSR-303註解來驗證屬性爲好。

我的問題是,如何做好他們互相交流?
如果我使用@Basic(optional=false)@NotNull,將我還是要用nullable=false等?

我還沒有決定使用哪個驗證器實現,例如hibernate-validator或oVal(你也可以建議其他人,我知道oVal is not a JSR-303 implementation, but it maps most annotations)。

橢圓手冊(見上文)指出某些JPA註釋將被翻譯成橢圓形的註解,以及。休眠驗證器has a similar mechanism

一些搜索結果聲稱Bean Validation和JPA確實重疊,但我還沒有弄清楚確切的方法。

回答

-1

幾乎完全閱讀了兩個規範後,這就是我發現的。

我會自己回答我的問題;
截至目前;

  • JPA和BV標註通常具有相同的含義。 然而,BV約束的使用不會影響JPA實現創建的DDL模式約束。

  • JPA的實施將,如果配置的話,請BV限制在預堅持,預更新和預刪除。這是通過將工作委託給BV實施來完成的。另一方面,BV的實現不會使用JPA約束。

  • 使用BV限制,如@NotNull自動地使JPA制約因素,如@Column(nullable=false)建議在BV規範的JPA實現,但不是正式規範的一部分,因此不可靠的行爲。

因此,我將不得不使用BV和JPA註釋,即使它們可能具有相同的含義。

參考

P.S .:我會等待是否有人有任何更正或補充,然後設置爲首選答案。

+0

只有你添加的東西不同於其他答案> @NotNull自動導致JPA約束是錯誤的休息與其他回答者相同。一旦提供了答案並且與您的答案相同(不同的措詞可能),並且一路給出錯誤信息,我就會投票給您答覆自己。 –

+0

那麼,我的問題是,一個註釋是否取代另一個註釋。 Shahzeb只解釋了哪些註釋生效的情況。當然,我的答案大多與他的答案相同,但它也包含了重要的一點(3.點列表)。此外,它還解釋了誰在進行驗證,何時完成驗證以及是否包含官方規範的確切參考。 – user967058

6

它們都是運行時檢查。還有,雖然
JPA規範狀態差一些@Basic(optional = false)可以用作模式提示也就是說,如果你正在更新由JPA(通常不是一個好的做法雖然),你可以用它來表明該列的值不能爲空和數據庫架構必須有價值。

Section 9.1.18 Basic Annotation of JPA1 specification

Section 11.1.6 Basic Annotation of JPA2 specification

清楚地表明。

除了在sql被髮送到數據庫之前,兩者都會進行運行時檢查。
如果您正在使用包含許多其他檢查的JSR 303,則通常在將SQL發送到服務器之前進行驗證,但是您將使用@NotNull,但是您可能沒有使用JSR 303,在這種情況下,您可以使用在JSR之前已經出現的@Basic(optional = false)然而,303並不比JSR303更受歡迎。
您現在可能想知道@Column(nullable = false)純粹用於數據庫端。
您是否曾經同時使用過 - 是的,只有當您允許JPA更新模式時,否則JSR-303優先於其他模式。