Java 有没有一种方法可以;刷新“;Springframework存储库?

Java 有没有一种方法可以;刷新“;Springframework存储库?,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个视图的实体,以及视图正在连接的一个表的实体: ViewEntity TableEntity 共享主键“SharedId”的 在我的服务类中,我为这两个实体声明了存储库,并有一个函数更新TableEntity的状态,并返回具有相同SharedId的相应ViewEntity的后续结果(该结果应显示更新的状态,因为视图基于从TableEntity表中加入“status”列): 问题是ViewEntity ret没有反映新的状态更改(它具有旧的status值,如果没有与此SharedId对应的

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

ViewEntity
TableEntity
共享主键“SharedId”的

在我的服务类中,我为这两个实体声明了存储库,并有一个函数更新TableEntity的状态,并返回具有相同SharedId的相应ViewEntity的后续结果(该结果应显示更新的状态,因为视图基于从TableEntity表中加入“status”列):

问题是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,以便使用最新的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;
  }
}

我可以想象,
提交
直到
方法
成功返回后才完成。当然,您可以
将其作为
ret.setStatus(newStatus)进行篡改
使用
saveAndFlush
而不是
save
。还要确保您在事务中执行所有这些操作,并且您以前没有加载
ViewEntity
(否则它可能来自一级缓存,而不是数据库)@jordiburgos,这不是此问题的重复。OP需要查看数据库中的更新数据,而不是重新启动其spring上下文。我使用的是Crudepository,它没有saveAndFlush函数。我已尝试移动save()它自己的方法,以及使用@transactional注释该方法,但仍然没有运气。只是更新,我不希望以编程方式重新启动上下文,因为这是一个经常使用的端点。我尝试将存储库更改为JpaRepository以使用saveAndFlush()和flush()选项,我尝试了sleep(以防在TableEntity存储库上保存后更新视图时出现延迟)。我已经在方法和存储库上尝试了@Transactional注释。到目前为止,没有成功。
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;
  }
}