1

我在 SpringBoot 应用程序中有这段代码。SpringBoot v1.5.14.RELEASE

    try {           
        bookAction result = bookActionRepository.save(bookAction);
    } catch (ObjectOptimisticLockingFailureException e) {
        LOG.error (e.getMessage());
    }
    return false;

但我在应用程序中有这个例外:

javax.persistence.OptimisticLockException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

OptimisticLockException和之间有什么区别ObjectOptimisticLockingFailureException?我怎么知道哪个异常会抛出应用程序?

4

1 回答 1

1

ObjectOptimisticLockingFailureException由 使用Spring ORM,通常是 的一部分Spring Data JPA,表示 OptimisticLocking 失败,因此某些更改了数据,这些数据将在当前事务中提交,在其他事务中。

在调查了 Spring ORM 类之后,我发现了一个可能是你答案的类。请参阅JpaOptimisticLockingFailureException。此异常的代码非常简单:

public class JpaOptimisticLockingFailureException extends ObjectOptimisticLockingFailureException {

    public JpaOptimisticLockingFailureException(OptimisticLockException ex) {
        super(ex.getMessage(), ex);
    }

}

请注意,它扩展ObjectOptimisticLockingFailureException并接受javax.persistence.OptimisticLockException并调用超级构造器,消息来自OptimisticLockException. 这就是您看到此类异常消息的原因。

要回答您的问题:

OptimisticLockException 和 ObjectOptimisticLockingFailureException 之间有什么区别?

OptimisticLockException特定于 JPA,它是许多供应商(如 Hibernate)正在实现的接口,并且ObjectOptimisticLockingFailureException特定于在Spring ORM内部使用 JPA/Hibernate。

我怎么知道哪个异常会抛出应用程序?

如果你正在使用Spring ORM你应该捕获ObjectOptimisticLockingFailureException异常,因为这是一个超类,HibernateOptimisticLockingFailureException所以JpaOptimisticLockingFailureException这个是最通用的,它的实现可能会包装其他具体的异常(如上所示)。还要记住,这些异常是RuntimeException这样的,所以如果你想基于它们执行一些处理,你应该明确地捕获它们。

于 2019-08-08T17:51:06.517 回答