【问题标题】: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 默认启用的是“预数据库”。 但无论如何,不​​管有没有&lt;validation-mode&gt;NONE&lt;/validation-mode&gt;,我的日志总是显示查询。可能是因为 Hibernate 日志记录,他们没有进入数据库,但我对真正发生的事情有点迷茫。

      没有&lt;validation-mode&gt;NONE&lt;/validation-mode&gt; 的验证和有的验证有什么区别。在文档 AFAIK 中没有找到任何关于此的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-11
        • 1970-01-01
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-26
        相关资源
        最近更新 更多