2012-08-08 40 views
2

我在Spring MVC应用程序中使用Hibernate验证器。 我在context.xml中配置它即使Hibernate Validator验证失败,Hibernate也会更新持久对象

<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更新它,即使验证此对象的失败!

我试图诠释的Validatorvalidate()

@PrePersist 
@PreUpdate 
@PreRemove 
public <RT> Set<ConstraintViolation<RT>> validate(RT target){...} 

但尽管如此,如果验证失败或者不更新不管。 如果验证失败,我不想抛出异常。

回答

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); 
} 
+0

感谢您的建议。我意识到会话驱逐和回滚功能。我想在春季控制器中自动检查休眠以及手动,因为我想通知最终用户无效输入。 – braincell 2012-08-09 07:57:01

相关问题