我无法理解为什么在从Hibernate Validator 3.X升级到4.X之后我不再获得DataIntegrityViolationException。
不知何故,Spring不再能够包含持久层异常了。
除了Validator依赖项之外没有任何变化,但是验证违反的情况下抛出DataIntegrityViolationException的测试不再通过。 我现在得到一个javax.validation.ConstraintViolationException。
一切都还在,包括当然 但翻译不再发生了。
帮助欢迎!
答案 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文档中没有找到任何相关内容。