首页 > 解决方案 > 数据未保存在嵌套服务调用中

问题描述

请假设以下代码:

@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。

标签: javaspringhibernatetransactions

解决方案


Hibernate 定义并支持 Transient、Persistent、Detached 对象状态。

doBussinesLogic 方法在您的情况下不是事务性的。

getUsers() 是另一种从数据库中获取记录的方法。所以看这里的唯一原因,实体(用户列表)在 doBussinesLogic 方法中处于分离模式。

getUsers 方法已完成其事务。然后您尝试更改和更新已分离的 doBussinesLogic 方法内的用户列表。

解决方案:-使这些方法正确地进行交易。


推荐阅读