更新到Hibernate Validator 4后无法获取Spring的DataIntegrityViolationException

时间:2011-10-18 08:09:23

标签: java spring bean-validation

我无法理解为什么在从Hibernate Validator 3.X升级到4.X之后我不再获得DataIntegrityViolationException。

不知何故,Spring不再能够包含持久层异常了。

除了Validator依赖项之外没有任何变化,但是验证违反的情况下抛出DataIntegrityViolationException的测试不再通过。 我现在得到一个javax.validation.ConstraintViolationException。

一切都还在,包括当然 但翻译不再发生了。

帮助欢迎!

2 个答案:

答案 0 :(得分:3)

根据JPA-2.0规范,如果在类路径中存在JSR-303验证器实现(即Hibernate Validator 4.x),则在持久化实体之前自动触发JSR-303验证。

因此,您的实体被Hibernate Validator拒绝,并且不会进入数据库,因此不会违反数据库完整性约束并且不会抛出DataIntegrityViolationException,而是获得JSR-303的ConstraintViolationException

您可以通过添加

来禁用此默认行为
<validation-mode>NONE</validation-mode>

persistence.xml

答案 1 :(得分:0)

这让我大吃一惊,但你说得对。

如果我关闭验证,我仍然会获得'验证',而不是获得DataIntegrityViolationException根本原因PropertyValueException,而是获得org.hibernate.exception.ConstraintViolationException,甚至不是预期的javax.validation.ConstraintViolationException }

因此看起来Hibernate Validator启用了2种验证。您似乎指出的是,新Bean验证默认启用的是'pre database'。 但无论如何,无论有没有<validation-mode>NONE</validation-mode>,我的日志总是显示查询。可能因为Hibernate日志记录而无法进入数据库,但我对于发生的事情感到很遗憾。

没有<validation-mode>NONE</validation-mode>的验证与验证之间有什么区别。在AFAIK文档中没有找到任何相关内容。