【问题标题】:javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated on preUpdate validationjavax.validation.ConstraintViolationException:更新前验证违反了 Bean 验证约束
【发布时间】:2011-08-30 21:05:41
【问题描述】:

我在尝试使用 JPA 2.0、SpringMvc 3.0 在多对多关系中插入新元素时遇到烦人的错误消息。

我有一张带States 的表格,还有一张带有Persons 的表格。一个人可以与许多国家联系,一个国家可以与许多人联系。 在这种特殊情况下,我有一个 listOfStates 和一个人,我想将这些元素插入到我的多对多关系中。

ManyToMany 关系(在表 STATE 中)

    //bi-directional many-to-many association to Appointment
    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(
name="PERSON_STATE"
, joinColumns={
    @JoinColumn(name="PERSON_ID", nullable=false)
    }
, inverseJoinColumns={
    @JoinColumn(name="CODE_STATE", nullable=false)
    }
)

我从控制器调用的 DAO 代码

try{    
    getEntityManager().getTransaction().begin();            
    getEntityManager().persist(myPerson);                       

    IStateDAO stateDAO = new StateDAO();

    for (int i=0; i<listOfStates.length; i++){
        State myState = stateDAO.findState(listOfStates[i]);
        if (myState != null){                   
            myState.getPersons().add(myPerson);
            getEntityManager().persist(myState);
        }
    }

    getEntityManager().getTransaction().commit();           
    getEntityManager().close();         

} catch (RuntimeException re) {
    getEntityManager().close();
    throw re;           
}

有趣的是,当我不从网页插入数据时,这段代码可以正常工作。我在这里做错了什么?我已经在数据库中有一些人和状态。

全栈错误消息:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'preUpdate'. Please refer to embedded ConstraintViolations for details.


javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'preUpdate'. Please refer to embedded ConstraintViolations for details.

任何指针都将不胜感激。先谢谢大家了。

【问题讨论】:

    标签: model-view-controller spring jpa


    【解决方案1】:

    哇!知道了!我不得不将我的 persistence.xml 中的 validation-mode 从 Auto 更改为 NONE,这基本上告诉应用程序根本不要使用 bean 验证。错误消息消失了,我的 DAO 运行良好。

    【讨论】:

    • 但是禁用验证并不能解决问题的核心,它只是忽略它。
    • 谢谢。但是,如果您可以对此进行更多调查,那么为什么验证是一个问题。请在这里分享。
    【解决方案2】:

    异常声明使用了JSR 303 Bean Validation,并且 Hibernate 已配置 (Persistence.xml) 以在更新任何内容之前对其进行检查。

    JSR 303 Bean Validation 是这样的注解:

    • javax.validation.constraints.NotNull
    • javax.validation.constraints.Size

    【讨论】:

    • 感谢您的回答。当从表单绑定它们时,我确实在类级别使用 Hibernate 验证器注释来验证我的类。但是对于这个特定的类,我没有指定任何约束,这让我觉得这更像是一个内部的东西。我不知道现在该去哪里。
    • user659580:异常没有说明约束违反与类 Person 相关!
    • 但是当我在持久化操作之后尝试刷新或提交 Person 时会发生异常。
    • @user659580 没有加载或更改其他内容?
    • 您的对象图中是否有任何 Bean 验证约束?日志中没有更多信息吗?应该在某处记录错误路径。这会让你知道哪个对象的哪个约束失败了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    相关资源
    最近更新 更多