Spring Data JPA сохраняет отношения многие ко многим при создании объектов - PullRequest
0 голосов
/ 11 февраля 2019

Есть ли способ оптимизировать следующий код.Этот фрагмент кода запускается ~ 1000 раз, и комбинации других фрагментов кода (которые нельзя изменить) вызовут серьезную проблему с производительностью.

Есть ли способ уменьшить количество операций базы данных?Я бы поместил дополнительныйFilesSave вне цикла, чтобы сделать это только один раз, но затем часть о создании ProductMAdditionalFilesEntities начинает вызывать проблему с идентификаторами дополнительных файлов (поскольку идентификаторы несохраненных файлов равны 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 голосов
/ 11 февраля 2019

Если JdbcTemplate - опция, общий подход должен быть следующим:

Вставьте файл, используя один из вариантов JdbcTemplate.update().Используйте KeyHolder для получения идентификатора, сгенерированного базой данных.

Вставьте ссылку на продукт, используя идентификатор продукта и идентификаторы, полученные из базы данных на первом шаге.Если ваша база данных поддерживает операторы слияния / вставки, это можно сделать одним оператором.В противном случае это два оператора.

Это сокращает объем работы до 2-3 операторов на файл.

Это должно быть еще быстрее, если вы можете использовать пакетные обновления.К сожалению, пакетные обновления плохо работают с генерацией идентификатора .Вы всегда можете использовать пакетные обновления для второго шага.Во-первых, вы могли бы генерировать идентификаторы на стороне Java, если, например, используете UUID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...