问题描述
我有一个@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的每一次脏检查都失败了,并进行了完全更新(同时更改了覆盖的值)>
谢谢