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

javax.persistence.OptimisticLockException VS org.springframework.orm.ObjectOptimisticLockingFailureException,java,spring,spring-boot,spring-data,javax.persistence,Java,Spring,Spring Boot,Spring Data,Javax.persistence,我在SpringBoot应用程序中有这段代码。SpringBoot v1.5.14.1版本 try { bookAction result = bookActionRepository.save(bookAction); } catch (ObjectOptimisticLockingFailureException e) { LOG.error (e.getMessage()); } return false

我在SpringBoot应用程序中有这段代码。SpringBoot v1.5.14.1版本

    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
之间有哪些区别?如何知道哪个异常将引发应用程序?

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

在对Spring ORM类进行调查之后,我发现一个类可能是您的答案。提到此异常的代码非常简单:

public class JpaOptimisticLockingFailureException extends ObjectOptimisticLockingFailureException {

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

}
请注意,它扩展了ObjectOptimisticLockingFailureException,并使用取自
OptimisticLockException
的消息调用超级构造函数。这就是为什么您会看到这样的异常消息

回答您的问题:

OptimisticLockException和ObjectOptimisticLockingFailureException之间有什么区别

OptimisticLockException
特定于JPA,这是一个由许多供应商(如Hibernate)实现的接口,
ObjectOptimisticLockingFailureException
特定于内部使用JPA/Hibernate的
Spring ORM

如何知道哪个异常将引发应用程序

如果您使用的是
Spring ORM
您应该捕获
ObjectOptimisticLockingFailureException
异常,因为这是
HibernateOptimisticLockingFailureException
jpaooptimisticlockingfailureexception
的一个超类,所以这是最通用的一个,它的实现可能会封装其他的具体的例外情况(如上所示)。还请记住,这些异常是
RuntimeException
,因此如果要基于它们执行某些处理,则应该显式捕获它们