Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠过时的对象_Java_Hibernate_Jpa_Spring Data Jpa_Staledataexception - Fatal编程技术网

Java 休眠过时的对象

Java 休眠过时的对象,java,hibernate,jpa,spring-data-jpa,staledataexception,Java,Hibernate,Jpa,Spring Data Jpa,Staledataexception,我使用多线程web应用程序中的SpringDataJPA保存对象 有时,我发现当我使用以下命令从会话加载对象时: 会话返回的对象已过时,并且不反映数据库中的最新版本。我只保存这个应用程序中的数据,并且只使用SpringDataJPA的一个实例 接口 可能是什么原因造成的以及我应该如何修复此问题?Hibernate使用PreparedStatement#executeUpdate结果检查更新的行数。如果没有匹配的行,则抛出(当使用HibernateAPI时)或(当使用JPA时) 是一种通用的并发

我使用多线程web应用程序中的SpringDataJPA保存对象

有时,我发现当我使用以下命令从会话加载对象时:

会话返回的对象已过时,并且不反映数据库中的最新版本。我只保存这个应用程序中的数据,并且只使用SpringDataJPA的一个实例 接口


可能是什么原因造成的以及我应该如何修复此问题?

Hibernate使用PreparedStatement#executeUpdate结果检查更新的行数。如果没有匹配的行,则抛出(当使用HibernateAPI时)或(当使用JPA时)

是一种通用的并发控制技术,适用于物理和计算机

因此,当多个并发请求修改相同的共享持久数据时,陈旧异常可以防止“丢失更新”现象

在应用程序级事务中,加载实体后,由于一级缓存(持久性上下文),您将获得逻辑可重复读取,但其他用户仍可以修改上述实体


因此,您确实可以遇到过时的实体,但乐观锁定机制可以防止在不使用任何额外数据库锁的情况下丢失更新,甚至可以用于长时间的对话。

我检查了缓存,它正在使用@cache(usage=cacheconcurrencysttrategy.READ\u WRITE)其他用户对您有什么看法?我只有一个应用程序。即使单个应用程序也可能被多个并发请求访问。是的,但所有请求都由一个singleton EntityManager处理。EntityManager不应包含任何过时数据。该实体管理器是线程绑定的。这就是为什么我们使用PersistenceContext而不是Resource或Inject。实体管理器不是单例。它是在事务边界上创建的。