Spring测试更新本地在事务期间读取JPA实体

时间:2018-01-12 22:48:46

标签: spring hibernate jpa spring-test transactional

我有一个包含在@Transactional中的Spring集成测试。 Hibernate / JPA数据库接口扩展JpaRepository并对其函数使用PESSIMISTIC_READPESSIMISTIC_WRITE锁。在测试中,将发生以下步骤:

  1. 从回购中读取@Entity个对象。
  2. 目标函数运行,它会将同一@Entity更新并写入另一个@Service级事务中的repo。
  3. 再次从回购中读取@Entity对象并与第一个对象进行比较。
  4. 问题是在第2步写入后,第一个@Entity对象实际上已在本地更新。在比较步骤3中的@Entity个对象时,两者都是相等的,而不是预期的“之前和之后”差异。

    本地@Entity对象的这种“同步”是如何发生的,这是预期的行为吗?

1 个答案:

答案 0 :(得分:1)

在使用正确的术语进行一些研究之后(例如,在持久化上下文中进行缓存),它似乎是预期的,如下所述: https://vladmihalcea.com/how-does-hibernate-store-second-level-cache-entries/

可行的解决方法是手动刷新实体或将2个读取分成不同的事务,如下所述: Force hibernate to read database and not returning cached entity