java - 有没有办法“刷新” Springframework Repository?
问题描述
我有一个视图的实体,以及该视图正在加入的其中一个表的实体:
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 没有反映新的状态更改(它具有旧的状态值,如果没有与此 SharedId 对应的先前 TableEntity 则为 null)。有谁知道为什么?
我猜这是因为 viewEntityRepository 是在保存 TableEntity 状态之前实例化的,因为后续调用将返回一个 ViewEntity 与前一个调用的 TableEntity 的状态(例如第一次调用 TableEntity status = "NEW" 将返回一个 ViewEntity 状态= null,第二次调用 TableEntity status = "MOVED" 将返回 ViewEntity status = "NEW")。
有没有办法在 tableEntityRepository.save 之后“刷新”或重新实例化 viewEntityRepository,以便 viewEntityRepository 更新为最新的 TableEntity 状态(假设 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;
}
}
推荐阅读
- powershell - 如何只更新正文请求中的一个字段?
- html - html更改表格行高
- c# - 如何释放传递给 C# 的 Delphi PByte?
- spring - KafkaListner initialoffset 消费已经确认的消息?
- c# - 分隔字符串中的每个字符
- python - 使用 matplotlib 生成等高线图
- java - 为什么 CPU 花费这么多时间执行 getNextJarEntry 方法?
- java - 通过从处理程序接收消息来更新 UI
- ios - GMSAutocompleteViewController 无法正常工作
- java - Spring Boot logback.xml 创建 .tmp 文件