有没有一种方法来“刷新” Springframework存储库?

时间:2019-12-13 00:37:33

标签: java spring spring-boot

我有一个视图的实体,以及该视图正在联接的表之一的实体:

ViewEntity
TableEntity

共享一个主键“ SharedId”。

在我的服务类中,我声明了两个实体的存储库,并具有一个更新TableEntity状态的函数,并返回具有相同SharedId的相应ViewEntity的后续结果(应显示更新的状态,如查看它是基于联接TableEntity表中的“状态”列):

class MyService {
    @Autowired
    ViewEntityRepository viewEntityRepository;

    @Autowired
    TableEntityRepository tableEntityRepository;

    ViewEntity updateTableEntity(String newStatus, TableEntity tableEntity) {
        tableEntity.status = newStatus;
        tableEntityRepository.save(viewEntity);
        ViewEntity ret = viewEntityRepository.findBySharedId(tableEntity.SharedId);
        return ret;
    }
}

问题是ViewEntity ret不能反映新的状态更改(它具有status的旧值,如果没有与此SharedId对应的先前的TableEntity,则为null)。有人知道为什么吗?

我猜这是因为viewEntityRepository是在保存TableEntity状态之前实例化的,因为后续调用将返回一个具有上一个调用的TableEntity状态的ViewEntity(例如,第一个调用TableEntity status =“ NEW”的调用将返回ViewEntity status = null,并且第二次调用TableEntity status =“ MOVED”时将返回ViewEntity status =“ NEW”。)

是否有一种方法可以在tableEntityRepository.save之后“刷新”或重新实例化viewEntityRepository,以使viewEntityRepository以最新的TableEntity状态更新(假设ViewEntity的视图在保存到TableEntity的表时进行了更新)?

1 个答案:

答案 0 :(得分:0)

使用EntityManager刷新返回项(需要@Transactional批注),以及使用saveAndFlush()而不是save()来解决此问题:

class MyService {
  @Autowired
  ViewEntityRepository viewEntityRepository;

  @Autowired
  TableEntityRepository tableEntityRepository;

  @PersistenceContext
  EntityManager entityManager

  @Transactional
  ViewEntity updateTableEntity(String newStatus, TableEntity tableEntity) {
      ViewEntity ret = viewEntityRepository.findBySharedId(tableEntity.SharedId);
      tableEntity.status = newStatus;
      tableEntityRepository.saveAndFlush(viewEntity);
      entityManager.refresh(ret)
      return ret;
  }
}