我在一个SpringBoot应用程序中有一段代码。SpringBoot v1.5.14 SpringBoot
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有什么区别?我如何知道哪个异常会抛出应用程序?
发布于 2019-08-08 17:51:06
ObjectOptimisticLockingFailureException由Spring ORM (通常是Spring Data JPA的一部分)使用,表示OptimisticLocking失败了,因此某些更改的数据将在当前事务中或在其他事务中执行。
在研究了Spring类之后,我找到了一个可能是您的答案的类。请参阅JpaOptimisticLockingFailureException。此异常的代码非常简单:
public class JpaOptimisticLockingFailureException extends ObjectOptimisticLockingFailureException {
public JpaOptimisticLockingFailureException(OptimisticLockException ex) {
super(ex.getMessage(), ex);
}
}请注意,它扩展了ObjectOptimisticLockingFailureException并接受了javax.persistence.OptimisticLockException,并使用从OptimisticLockException获取的消息调用超级构造器。这就是为什么您会看到这样的异常消息。
回答你的问题:
OptimisticLockException和ObjectOptimisticLockingFailureException有什么区别?
OptimisticLockException是特定于JPA的,JPA是由许多厂商(比如Hibernate)实现的接口,而ObjectOptimisticLockingFailureException是特定于在内部使用JPA/Hibernate的Spring ORM。
我如何知道哪个异常会抛出应用程序?
如果您正在使用Spring ORM,您应该捕获ObjectOptimisticLockingFailureException异常,因为这是HibernateOptimisticLockingFailureException和JpaOptimisticLockingFailureException的一个超类,因此这个类是最通用的,它的实现可能会包装其他具体的异常(如上面所示)。还请记住,这些异常是RuntimeException,因此如果您想要基于它们执行某些处理,则应该显式地捕获它们。
https://stackoverflow.com/questions/57222104
复制相似问题