2

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

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

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

我加载一个:

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

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

我试图用 with 注释validate()方法Validator

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

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

4

1 回答 1

1

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

或者,如果您想像当前一样手动启动验证,则由您决定如何处理导致验证失败的对象。

例如,您可以抛出异常来触发当前事务的回滚(如果您使用 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);
}
于 2012-08-08T17:25:43.743 回答