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)
OptimisticLockException
和ObjectOptimisticLockingFailureException
有什么区别?我怎么知道应用程序会抛出哪个异常?
ObjectOptimisticLockingFailureException
被 Spring 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
异常,因为这是 HibernateOptimisticLockingFailureException
和 JpaOptimisticLockingFailureException
的超级 class,所以这个是最通用的一个,它的实现可能会包装其他具体的异常(如上所示)。还请记住,这些异常是 RuntimeException
,因此如果您想基于它们执行某些处理,您应该明确捕获它们。
我在 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
有什么区别?我怎么知道应用程序会抛出哪个异常?
ObjectOptimisticLockingFailureException
被 Spring 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
异常,因为这是 HibernateOptimisticLockingFailureException
和 JpaOptimisticLockingFailureException
的超级 class,所以这个是最通用的一个,它的实现可能会包装其他具体的异常(如上所示)。还请记住,这些异常是 RuntimeException
,因此如果您想基于它们执行某些处理,您应该明确捕获它们。