簡體   English   中英

Spring Data JPA在創建對象時保存了多對多關系

[英]Spring Data JPA save many to many relation while creating the objects

有沒有一種方法可以優化以下代碼。 這段代碼運行了大約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()));
            }

如果JdbcTemplate是一個選項,則應采用以下常規方法:

使用JdbcTemplate.update()變體之一插入文件。 使用KeyHolder獲取數據庫生成的ID。

第一步,使用產品ID和從數據庫中獲得的ID插入對產品的引用。 如果您的數據庫支持merge / upsert語句,則可以在單個語句中完成。 否則,這是兩個語句。

這樣可以將工作減少到每個文件2-3個語句。

如果您可以使用批處理更新,這應該更快。 不幸的是,批量更新不適用於id generation 您始終可以將批處理更新用於第二步。 對於第一個,例如,如果使用UUID,則可以在Java端生成ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM