我有一个 View 实体,以及该 View 正在连接的表之一的实体:
ViewEntity
TableEntity
共享主键“SharedId”。
在我的服务类中,我声明了两个实体的存储库,并具有一个更新 TableEntity 状态的函数,并返回具有相同 SharedId 的相应 ViewEntity 的后续结果(应显示更新后的状态,如查看它是基于连接 TableEntity 表中的“status”列):
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 没有反射(reflect)新的状态更改(它具有旧的状态值,如果没有与此 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 的 View 在保存 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;
}
}
关于java - 有没有办法访问 Springframework 存储库 "refresh"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59314644/