【问题标题】:Unable to get Spring's DataIntegrityViolationException after update to Hibernate Validator 4更新到 Hibernate Validator 4 后无法获取 Spring 的 DataIntegrityViolationException
【发布时间】:2011-10-18 08:09:22
【问题描述】:
我不明白为什么在从 Hibernate Validator 3.X 升级到 4.X 后不再收到 DataIntegrityViolationException。
不知何故,Spring 不再能够包装持久层异常。
除了 Validator 依赖项之外没有任何变化,但验证 DataIntegrityViolationException 在验证违规情况下被抛出的测试不再通过。
我现在得到一个 javax.validation.ConstraintViolationException。
一切都还在原处,当然包括
但翻译不再发生。
欢迎帮助!
【问题讨论】:
标签:
java
spring
bean-validation
【解决方案1】:
根据 JPA-2.0 规范,如果类路径中存在 JSR-303 验证器实现(即 Hibernate Validator 4.x),则在持久化实体之前会自动触发 JSR-303 验证。
因此,您的实体被 Hibernate Validator 拒绝并且不会进入数据库,因此不会违反数据库完整性约束并且不会抛出 DataIntegrityViolationException,而是会获得 JSR-303 的 ConstraintViolationException。
您可以通过添加禁用此默认行为
<validation-mode>NONE</validation-mode>
致您的persistence.xml。
【解决方案2】:
这让我大吃一惊,但你说得对。
如果我关闭验证,我仍然会得到“验证”,而不是得到DataIntegrityViolationException 根本原因PropertyValueException,我得到org.hibernate.exception.ConstraintViolationException,甚至不是预期的javax.validation.ConstraintViolationException
所以看起来 Hibernate Validator 启用了 2 种验证。您似乎表明的是,新 Bean Validation 默认启用的是“预数据库”。
但无论如何,不管有没有<validation-mode>NONE</validation-mode>,我的日志总是显示查询。可能是因为 Hibernate 日志记录,他们没有进入数据库,但我对真正发生的事情有点迷茫。
没有<validation-mode>NONE</validation-mode> 的验证和有的验证有什么区别。在文档 AFAIK 中没有找到任何关于此的内容。