即使使用Hibernate Validator验证失败,Hibernate也会更新持久对象

时间:2012-08-08 16:12:17

标签: spring hibernate validation

我在Spring MVC应用程序中使用Hibernate Validator。 我在context.xml中配置了它

<bean id="validator" class="com.mycompany.appname.validation.Validator" />

现在我在我的控制器中使用它来验证不同的对象。 对于瞬态对象来说没问题,但是持久对象呢?对于e.x:

我加载一个:

MyObject o = myDao.getById(someId);
o.setName(name);
o.setPhone(phone);
Set<ConstraintViolation<o>> violations= validator.validate(o);

即使此对象的验证失败,Hibernate也会更新它!

我尝试使用

注释validate() Validator方法
@PrePersist
@PreUpdate
@PreRemove
public <RT> Set<ConstraintViolation<RT>> validate(RT target){...}

但无论验证失败与否,它仍会更新。 如果验证失败,我不想抛出异常。

1 个答案:

答案 0 :(得分:1)

您可以将Hibernate配置为在自动更新之前执行验证,请参阅7.3. ORM integration。如果您不想在验证失败的情况下执行特定操作,这可能是最佳选择。

或者,如果您希望手动启动验证,则由您自行决定如何处理导致验证失败的对象。

例如,您可以抛出异常来触发当前事务的回滚(如果使用Spring事务管理),这样您所做的更改就不会保存到数据库中。

如果您不想回滚事务,可以通过调用Session.evict()从会话中删除实体,以防止无效状态保存:

Set<ConstraintViolation<Merchant>> violations= validator.validate(o); 
if (!violations.isEmpty()) myDao.doNotUpdate(o);

public void doNotUpdate(MyObject o) {
    sf.getCurrentSession().evict(o);
}