【发布时间】:2020-07-15 15:58:34
【问题描述】:
我在解析或处理我的 @Transational 方法之间的数据时遇到了问题。或者我对@Transactionl的理解有误。
这是我的场景
Method A
@Transactional
public void methodA {
MyEntity e = myRepo.findByid(1).orElseThrow();
e.setMyFlag(1123);
methodB();
myRepo.save(e);
}
@Transactional
public void methodB {
MyEntity e = myRepo.findByMyFlag(1123).orElseThrow(); <--- This throws Not Found Exception
// do something 'e' entity that is having a myFlag = 1123
// i am not modifying the entity just doing something externally
// using myFlag value 1123
}
我的理解是,methodB 正在使用methodA 中的会话。现在,鉴于它使用的是同一个会话,我可以在methodA 中获取尚未提交的数据集或尚未调用save()。如果我错了,请纠正我并指出正确的。另外,上面的场景是我想要实现的。
仅供参考,我还尝试在 save() 呼叫之后移动 methodB 呼叫。还是出现Not found异常
【问题讨论】:
-
看起来不正确。由于它们在同一事务和同一会话中执行,因此休眠将在执行
findByMyFlag(1123)之前自动刷新(不提交)会话中的任何内容。myRepo.findByMyFlag(1123)是如何实现的? -
只是一个普通的
@Query(value="select * from my_table where my_flag = ?1", nativeSql=true) -
可能是hibernate没有在原生查询上刷新。为什么需要原生查询查询? SpringDataJPA 应该根据你的方法生成查询吧?
findByMyFlag方法名称似乎正确 -
哦,是的,也通过spring-jpa尝试过,仍然无法访问数据
-
只是为了排查问题,能不能在
methodB();上面加上myRepo.flush(e);并删除myRepo.save(e);
标签: java spring jpa spring-data-jpa spring-data