java - Hibernate 在调用 findOne 时返回陈旧的对象

标签 java hibernate jpa spring-data-jpa staledataexception

我正在使用 Spring Data JPA 保存对象 save(Object entity) method来自多线程网络应用程序。

偶尔我发现当我使用以下方法从 session 加载对象时:

findOne(long id)

从 session 返回的对象是陈旧的并且不反射(reflect)数据库中的最新版本。我只保存来自这个应用程序的数据并且只使用一个 Spring Data JPA 实例 界面。

可能是什么原因造成的,我应该如何解决这个问题?

最佳答案

Hibernate 使用 PreparedStatement#executeUpdate 结果来检查更新的行数。如果没有匹配的行,它会抛出 StaleObjectStateException。 (使用 Hibernate API 时)或 OptimisticLockException (使用 JPA 时)。

Optimistic locking是一种通用的并发控制技术,它适用于物理和 application-level transactions .

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

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

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

关于java - Hibernate 在调用 findOne 时返回陈旧的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25935978/

相关文章:

java - 如何使用 Hibernate/JPA 调用返回字符串的 Oracle 函数?

java - 在进行批量更新时,PostUpdate Hook 不起作用

java - 页面刷新验证

java - 使用正弦波进行流畅的过渡

java - 无法使我在嵌套循环中创建的菜单正常运行

测试中的 Hibernate OnDelete 级联不起作用

java - 控制台应用程序中基于选项卡的自动完成

java - Spring、Hibernate : Retrieve Objects based upon date, 如果未找到,则为最近的日期

java - Hibernate:按日期和时间排序数据

java - 两个不同实体中的相同 @NamedQueries 会发出警告