我有一个视图的实体,以及该视图要加入的表之一的实体:

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状态= null,第二次调用TableEntity status =“ MOVED”将返回ViewEntity status =“ NEW”)。

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

最佳答案

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

09-27 14:25