Spring Data JPA在创建对象时保存了多对多关系

时间:2019-02-11 13:26:21

标签: java spring spring-data-jpa

有没有一种方法可以优化以下代码。该代码段运行了大约1000次,并且与其他代码段(无法更改)的组合将导致严重的性能问题。

是否有减少数据库操作数量的方法?我将additionalFilesSave放在循环之外,只能执行一次,但是随后创建ProductMAdditionalFilesEntities的部分开始引起附加文件的ID问题(因为未保存文件的ID为0)。

Set<AdditionalFilesEntity> additionalFilesEntities = productEntity.getAdditionalFilesEntities();

            if (p.getAdditionalFiles() != null) {
                for (AdditionalFile additionalFile : p.getAdditionalFiles()) {
                    AdditionalFilesEntity additionalFilesEntity = new AdditionalFilesEntity();
                    if (additionalFile.getFileType().equals("PICTURE")) {
                        additionalFilesEntity.setFileType(FileTypeEnum.PICTURE);
                    } else {
                        additionalFilesEntity.setFileType(FileTypeEnum.FILE);
                    }
                    additionalFilesEntity.setFileName(additionalFile.getFileName());
                    additionalFilesEntity.setFileDescription(additionalFile.getFileDescription());
                    additionalFilesEntity.setUrl(URLDecoder.decode(additionalFile.getFileUrl()));
                    additionalFilesEntities.add(additionalFilesEntity);
                }
            }

            additionalFilesRepository.save(additionalFilesEntities);

            for (AdditionalFilesEntity additionalFilesEntity : additionalFilesEntities) {
                pmf.add(new ProductMAdditionalFilesEntity(productEntity.getId(),
                    null,
                    additionalFilesEntity.getId()));
            }

1 个答案:

答案 0 :(得分:1)

如果选择JdbcTemplate,则应采用以下常规方法:

使用JdbcTemplate.update()变体之一插入文件。 使用KeyHolder获取数据库生成的ID。

使用产品ID和第一步中从数据库获得的ID插入对产品的引用。 如果您的数据库支持merge / upsert语句,则可以在单个语句中完成。 否则,它是两个语句。

这将工作减少到每个文件2-3个语句。

如果您可以使用批量更新,这应该更快。 不幸的是,批量更新don't work well with id generation。 您始终可以将批处理更新用于第二步。 对于第一个,例如,如果您使用UUID,则可能能够在Java端生成ID。