java - 是否 hibernate 分离对象的默认乐观锁定?

标签 java hibernate jpa locking optimistic

我有一个应用程序:

void deleteObj(id){
    MyObj obj = getObjById(id);
    if (obj == null) {
        throw new CustomException("doesn't exists");
    }
    em.remove(obj);//em is a javax.persistence.EntityManager
}

我还没有明确配置 optimistic locking带有版本字段。但是,如果两个请求并行运行,试图删除同一个对象,那么我有时会得到一个 HibernateOptimisticLockingFailureException,有时会得到“CustomException”。

在没有显式设置乐观锁的情况下获取 HibernateOptimisticLockingFailureException 是否正常?是否为分离对象 hibernate 默认的乐观锁定?

你正在做什么来处理这个 HibernateOptimisticLockingFailureException ?重试或使用“服务器繁忙”等默认消息通知用户?

最佳答案

首先,HibernateOptimisticLockingFailureException是Spring持久化异常翻译机制的结果。它被抛出以响应 StaleStateException ,其 javadoc 说:

Thrown when a version number or timestamp check failed, indicating that the Session contained stale data (when using long transactions with versioning). Also occurs if we try delete or update a row that does not exist.

从常识上看,乐观锁异常发生在数据修改语句返回意外数量的受影响行时。这可能是由于版本值不匹配以及根本不存在该行引起的。

要确保该实体确实被删除,您可以尝试在删除后立即通过 em.flush() 刷新上下文并捕获它抛出的异常(注意它应该是 PersistenceExceptionStaleStateException 为原因)。

关于java - 是否 hibernate 分离对象的默认乐观锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4619709/

相关文章:

java - hibernate 当前日期不工作

jpa - 仅在某些实体关系中禁用附加条件

java - Hibernate GenerationType.IDENTITY 与 GenerationType.SEQUENCE

java - 立即获取日期和时间

java - Spring Boot - 处理未找到的静态资源(404)并能够识别异常原因

java - 从 Annotation 对象获取原始对象

Java - 如何在打印时改进渲染?

java - 删除多对多条目,同时将两个对象都保留在数据库中

java - 无法从 FTP 服务器下载文件

java - Hibernate 和 Ehcache 中的可变 ID 安全吗?