【问题标题】:How to avoid automatic entity update on Hibernate ValidationException如何避免 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

标签: java spring hibernate validation orm


【解决方案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 检查
    猜你喜欢
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多