javax.persistence.OptimisticLockException VS org.springframework.orm.ObjectOptimisticLockingFailureException

javax.persistence.OptimisticLockException VS org.springframework.orm.ObjectOptimisticLockingFailureException

我在 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)

OptimisticLockExceptionObjectOptimisticLockingFailureException有什么区别?我怎么知道应用程序会抛出哪个异常?

ObjectOptimisticLockingFailureExceptionSpring ORM 使用,它通常是 Spring Data JPA 的一部分,以指示 OptimisticLocking 失败,因此某些更改的数据将在当前事务中提交,在其他交易中。

在调查 Spring ORM classes 之后,我发现 class 可能是您的答案。参考JpaOptimisticLockingFailureException。此异常的代码非常简单:

public class JpaOptimisticLockingFailureException extends ObjectOptimisticLockingFailureException {

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

}

请注意,它扩展了 ObjectOptimisticLockingFailureException 并接受了 javax.persistence.OptimisticLockException,并且它使用从 OptimisticLockException 获取的消息调用超级构造函数。这就是您看到此类异常消息的原因。

回答您的问题:

What difference there are between OptimisticLockException and ObjectOptimisticLockingFailureException ?

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

How do I know which exception will throw the application ?

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