java Spring数据批量保存实体并使用JPA存储库更新实体
我有一个服务,它有一个@Transactional
方法,可以使用JpaRepositiry接口对托管实体执行很多操作,比如更新值和删除实体
另一方面,在同一个事务方法中,我有一个代码,可以在批处理中创建很多实体
private void methodA() {
......
fetch fieldsToModify and projectsToDelete
......
log.debug("Modifying fields {}", fieldsToModify.size());
issueTrackerFieldRepo.save(fieldsToModify);
log.info("Delete projects {}", projectsToDelete.size());
issueTrackerProjectRepository.delete(projectsToDelete);
log.info("Adding projects {}", projectsToAdd.size());
saveEntitiesInBatch(projectsToAdd);
}
private void saveEntitiesInBatch(List<?> entities) {
for (int i = 0; i < entities.size(); i++) {
Object p = entities.get(i);
log.debug("Creating entity {}", p.getClass().getSimpleName());
entityManager.persist(p);
if (i % batchSize == 0) {
log.debug("Flushing entity manager for {}", i);
entityManager.flush();
entityManager.clear();
}
}
entityManager.flush();
entityManager.clear();
log.debug("Flushing entity manager");
}
其中fieldsToModify
和projectsToDelete
是使用jpa存储库以相同方法获取并修改的实体列表
问题是,当调用批处理方法saveEntitiesInBatch
时,在实体被“遗忘”之前,所有对象都会被修改。这也是javadoc所说的
我想让所有这些代码在同一个事务中运行。如何使批处理插入和jpa存储库友好地生活在一起
共 (0) 个答案