有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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");
}

其中fieldsToModifyprojectsToDelete是使用jpa存储库以相同方法获取并修改的实体列表

问题是,当调用批处理方法saveEntitiesInBatch时,在实体被“遗忘”之前,所有对象都会被修改。这也是javadoc所说的

我想让所有这些代码在同一个事务中运行。如何使批处理插入和jpa存储库友好地生活在一起


共 (0) 个答案