如何避免 Hibernate ValidationException 上的自动实体更新

Posted

技术标签:

【中文标题】如何避免 Hibernate ValidationException 上的自动实体更新【英文标题】:How to avoid automatic entity update on Hibernate ValidationException 【发布时间】:2015-07-23 09:33:22 【问题描述】:

我有一个spring 方法:我在构造对象后验证实体,该对象之前是从数据库中获取的。

@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 被抛出之后。这些值仍然保留在数据库中。我怎样才能避免这种情况。

【问题讨论】:

您确定您没有在mergeWithExistingobject 中提交更改吗? validatorService 是否处于弹簧控制之下?请张贴ValidatorService 代码。 @Suganthan 你能提供异常日志吗? @DraganBozanovic,是的,我确定。我正在从数据库中获取一个对象并更新它的新更改。 @PawełGłowacz 是的,它是 Spring 托管 bean 【参考方案1】:

你可以驱逐ValidationException上的实体:

try 
    validatorService.validate( obj );
 catch (ValidationException e) 
    entityManager.detach(obj);
    //Or with Hibernate API
    //session.evict(obj); 
    throw e;

【讨论】:

【参考方案2】:

我从未使用过 spring,但如果它与 EJB 相同,那么只有在引发未经检查的异常时才会回滚事务。

当从 EJB 方法抛出 java.lang.Exception 时,您显然必须在方法的签名中使用 throws 关键字声明它。在这种情况下发生的情况如下 1) 事务被提交 2) 异常被重新抛出给客户端

取自this link

【讨论】:

是的,你是对的。但就我而言,即使exception 抛出。事务将被提交,因为如果 isDirty 检查

以上是关于如何避免 Hibernate ValidationException 上的自动实体更新的主要内容,如果未能解决你的问题,请参考以下文章

覆盖spring web mvc的默认Hibernate Validator

Hibernate validation 注释

JSR303/JSR-349,hibernate validation,spring validation 之间的关系

hibernate validation 手动参数校验 不经过spring

Hibernate Validator表单验证异常javax.validation.UnexpectedTypeException问题

hibernate3以上版本缺少validation