java - 数据未保存在嵌套服务调用中
问题描述
请假设以下代码:
@RestController
class C {
@Autowired
Service1 service1;
@PostMapping
Result someChanges(Data data) {
return service1.update(data);
}
}
class Service1 {
@Autowired
Service2 service2;
@Aautowired
Service1Repo s1repo;
@Transactional
Result update(Data data){
service2.doBussinesLogic();
s1repo.save(data);
}
}
class Service2 {
@Autowired
Service2Repo s2Repo;
void doBussinesLogic(){
List users = getUsers();
//alter users
s2Repo.saveAll(users);
}
}
当我点击 someChanges 端点时,我得到了奇怪的结果。我希望这两个服务调用都会将数据保存到数据库中,但由于我不知道的一些原因,我只保存了 s1repo.save(data)。至于 s2Repo.saveAll(users) 用户由于某种原因没有更新。我认为由于事务回滚,但为什么 s1repo.save(data) 保存呢?为什么我有这么奇怪的行为?我应该检查哪些情况?我希望两个 repo 调用都保留在数据库中,但只保留 repo1 调用。我使用 Spring Boot、Spring Data、Hibernate。
解决方案
Hibernate 定义并支持 Transient、Persistent、Detached 对象状态。
doBussinesLogic 方法在您的情况下不是事务性的。
getUsers() 是另一种从数据库中获取记录的方法。所以看这里的唯一原因,实体(用户列表)在 doBussinesLogic 方法中处于分离模式。
getUsers 方法已完成其事务。然后您尝试更改和更新已分离的 doBussinesLogic 方法内的用户列表。
解决方案:-使这些方法正确地进行交易。
推荐阅读
- c# - C# 中非包装类中的集合的 FluentValidation
- c# - 如何在 Razor Page OnInitialized 事件中使用 404 路由
- c# - 在从 svcutil 创建的客户端发送 SOAP 请求时更改信封的命名空间
- java - 我想从firebase检索当前用户的ID并将其写入另一个节点,但它只是一直拒绝
- python - Pymongo - 如何将数组添加到列表并读取它
- reactjs - 如何将边框半径添加到 react-konva Image 对象?
- html - 更改 HTML 中的图标大小
- python - 模板中的 Django URL,其中包含 slug
- dataset - 是否可以将内存中的 Jena 数据集存储为三重存储?
- django - is there a way to run my django project server as always reflect the changes?