首页 > 解决方案 > 在事务提交后使用 Spring transactionManager 和 Hibernate,实际上只提交了一个两个存储库

问题描述

我有一种@Transactional方法可以改变两个不同的、不相关的存储库实体的状态。

像这样的东西:

@Transactional
public void foo() {
  A a = repoA.findById(1);
  a.setState(s1);
  B b = repoB.findById(1);
  b.setState(s2);
  // (and I also do repoA.save(a); and repoB.save(b); although it is redundant)
} 

我还有一个事务方法bar,它调用foo和发布一个被这样捕获的事件TransactionalEventListener

@Transactional 
public void bar() {
  foo();
  applicationEventPublisher.publishEvent(new AppEvent(123));
}

@Component
public class MyApplicationEventListener {

    @TransactionalEventListener
    public void handleAfterCommit(AppEvent appEvent){
       //do something;
    }
}

handleAfterCommit现在的问题是,在调用方法的 80% 的时间里,只有(A a )被提交但(B b)正在丢失其更改。

我需要帮助来了解这里发生了什么,我尝试调试和探索 TransactionAspectSupport.currentTransactionStatus()但没有找到任何见解。

谢谢,
艾隆

标签: javaspringhibernatetransactions

解决方案


我发现了问题,我们正在使用自定义的 AttributeConverter,并且我们没有为相关的 javav 对象实现 Equals,这导致对 select 的每次脏检查都失败并进行了完全更新(同时覆盖了已更改的值)

谢谢


推荐阅读