java - 在事务提交后使用 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 的每次脏检查都失败并进行了完全更新(同时覆盖了已更改的值)
谢谢
推荐阅读
- c# - 如何在 Windows 应用程序中集成命令提示符/终端?
- r - 使用 R 拆分包装字符串
- python - 将文本文件数据传递给变量
- cornerstone-lms - CSOD 未经授权的异常:检查您的凭据
- scala - 如何在 scala 中设置 spark.sql.pivotMaxValues?
- python - 打印self的目的是什么?
- android - 已解决写入 sdcard 权限 android +6
- c# - SQL从3个表中检索用户名和密码
- knex.js - 如何使用字段白名单批量插入 knex.js?
- python - 在没有提示的情况下将数据框保存到 csv/xls - 您是否要允许对以下内容进行读写访问: