我在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){...}
但无论验证失败与否,它仍会更新。 如果验证失败,我不想抛出异常。
答案 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);
}