JSR-303和JPA重叠

时间:2011-09-29 09:57:49

标签: java jpa bean-validation

阿罗哈嘿!

我已经使用了JPA注释,现在我也想使用JSR-303注释来验证属性。

我的问题是,他们彼此之间的互动程度如何?
如果我使用@Basic(optional=false)@NotNull,我还需要使用nullable=false等吗?

我还没有决定使用哪种验证器实现,例如hibernate-validator或oVal(你也可以建议别人。我知道oVal is not a JSR-303 implementation, but it maps most annotations)。

oVal手册(见上文)指出某些JPA注释也将被翻译成oVal注释。 Hibernate-validator has a similar mechanism

一些搜索结果声称Bean Validation和JPA正式重叠,但我没有想到以哪种方式。

2 个答案:

答案 0 :(得分: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发送到数据库之前,两者都会进行运行时检查 一般用于在将SQL发送到服务器之前进行验证,如果您使用的JSR 303包含许多其他检查,那么您将使用@NotNull但是您可能没有使用JSR 303,在这种情况下您可以使用@Basic(optional = false)甚至在JSR 303之前就已经出局了,但是不比JSR303更受欢迎 您现在可能想知道@Column(nullable = false)纯粹用于数据库方面 您是否应该同时使用两者 - 只有在允许JPA更新架构时才会使用,否则JSR-303优先于另一个。

答案 1 :(得分:-1)

几乎完全阅读这两个规格后,这就是我发现的。

我会自己回答我的问题;
截至目前;

  • JPA和BV注释通常具有相同的含义。 但是,BV约束的使用不会影响JPA实现的已创建DDL架构约束。

  • 如果配置了JPA实现,请在预先保留,预更新和预删除时检查BV约束。这是通过将工作委托给BV实现来完成的。另一方面,BV实现不会使用JPA约束。

  • 建议使用BV约束(例如@NotNull)自动导致JPA约束,例如@Column(nullable=false),这是BV规范中的JPA实现,但不是官方规范的一部分,因此不可靠行为。

因此,我将不得不使用BV和JPA注释,即使它们可能具有相同的含义。

<强>参考

P.S。:我会等到有人对此有任何更正或补充,然后设置为首选答案。