首页 > 解决方案 > 有没有办法“刷新” Springframework Repository?

问题描述

我有一个视图的实体,以及该视图正在加入的其中一个表的实体:

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 没有反映新的状态更改(它具有旧的状态值,如果没有与此 SharedId 对应的先前 TableEntity 则为 null)。有谁知道为什么?

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

有没有办法在 tableEntityRepository.save 之后“刷新”或重新实例化 viewEntityRepository,以便 viewEntityRepository 更新为最新的 TableEntity 状态(假设 ViewEntity 的视图在保存 TableEntity 的表时更新)?

标签: javaspringspring-boot

解决方案


使用 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;
  }
}

推荐阅读