我有一个视图的实体,以及该视图正在联接的表之一的实体:
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的表时进行了更新)?
答案 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;
}
}