我已经使用了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正式重叠,但我没有想到以哪种方式。
答案 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。:我会等到有人对此有任何更正或补充,然后设置为首选答案。