我有一个spring
方法:我在构建对象之后验证实体,这是先前从DB中获取的。
@Transactional(rollbackFor={ValidationException.class})
public Object approve(Command command) throws ValidationException {
Object obj = merger.mergeWithExistingobject(command); // where I am fetching object from DB with old values and construct the new object
validatorService.validate( obj ); // which throws ValidationException
return saveObject(obj);
}
但不幸的是,即使在ValidationException
被抛出之后。这些值仍然存在于DB中。我怎样才能避免这种情况。
答案 0 :(得分:1)
您可以在ValidationException
上逐出实体:
try {
validatorService.validate( obj );
} catch (ValidationException e) {
entityManager.detach(obj);
//Or with Hibernate API
//session.evict(obj);
throw e;
}
答案 1 :(得分:0)
我从未使用过spring,但如果这与EJB相同,那么只有在抛出未经检查的异常时才会回滚事务。
当从EJB方法抛出java.lang.Exception时,您显然必须使用thethrows关键字在方法的签名中声明它。在这种情况下发生的事情如下:1)事务被提交2)异常被重新抛给客户端