我有一个视图的实体,以及该视图要加入的表之一的实体:
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;
}
}