【问题标题】:Spring test updates locally read JPA entity during transaction [duplicate]Spring测试在事务期间更新本地读取的JPA实体[重复]
【发布时间】:2018-06-22 10:28:36
【问题描述】:

我有一个封装在 @Transactional 中的 Spring 集成测试。 Hibernate/JPA 数据库接口扩展JpaRepository 并在其功能上使用PESSIMISTIC_READPESSIMISTIC_WRITE 锁。在测试中,会发生以下步骤:

  1. 从存储库中读取了一个 @Entity 对象。
  2. 目标函数运行,它将相同的@Entity 更新并写入另一个@Service 级别事务中的repo。
  3. 再次从存储库中读取 @Entity 对象并与第一个对象进行比较。

问题是在第2步写完之后,第一个@Entity对象其实已经在本地更新了。在第 3 步中比较 @Entity 对象时,两者是相等的,而不是预期的“之前和之后”的差异。

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

【问题讨论】:

  • “另一个@Service级事务”是什么意思?服务方法是否配置为需要事务(即REQUIRES_NEW)?
  • 如果不是,那么您描述的用例很可能包含在 Spring 参考手册中的这个 note 中:docs.spring.io/spring/docs/current/spring-framework-reference/…
  • @SamBrannen 服务只使用默认的@Transactional。感谢您的参考,我会研究一下我的测试

标签: spring hibernate jpa spring-test transactional


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-04-20
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多