在事务仅提交了两个的一个存储库之后,将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(),但没有发现任何见解。

谢谢,
艾伦

解决方法

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

谢谢