Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据JPA在创建对象时保存多对多关系_Java_Spring_Spring Data Jpa - Fatal编程技术网

Java Spring数据JPA在创建对象时保存多对多关系

Java Spring数据JPA在创建对象时保存多对多关系,java,spring,spring-data-jpa,Java,Spring,Spring Data Jpa,是否有一种方法可以优化以下代码。这段代码运行了约1000次,与其他代码段的组合(无法更改)将导致严重的性能问题 有没有办法减少数据库操作的数量?我会将additionalFilesSave放在循环之外,只执行一次,但是关于创建ProductMadditionalFileSenties的部分开始导致其他文件的ID-s出现问题(因为未保存文件的ID-s为0) Set additionalFileEntities=productEntity.getAdditionalFileEntities(); 如

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

有没有办法减少数据库操作的数量?我会将additionalFilesSave放在循环之外,只执行一次,但是关于创建ProductMadditionalFileSenties的部分开始导致其他文件的ID-s出现问题(因为未保存文件的ID-s为0)

Set additionalFileEntities=productEntity.getAdditionalFileEntities();
如果(p.getAdditionalFiles()!=null){
对于(AdditionalFile AdditionalFile:p.getAdditionalFiles()){
AdditionalFilesEntity AdditionalFilesEntity=新的AdditionalFilesEntity();
if(additionalFile.getFileType().equals(“PICTURE”)){
AdditionalFileEntity.setFileType(FileTypeEnum.PICTURE);
}否则{
additionalFilesEntity.setFileType(FileTypeEnum.FILE);
}
additionalFilesEntity.setFileName(additionalFile.getFileName());
AdditionalFileEntity.setFileDescription(additionalFile.getFileDescription());
additionalFilesEntity.setUrl(urldecker.decode(additionalFile.getFileUrl());
additionalFilesEntity.add(additionalFilesEntity);
}
}
additionalFilesRepository.save(additionalFilesEntities);
for(AdditionalFilesEntity AdditionalFilesEntity:additionalFilesEntities){
pmf.add(新产品附加文件(productEntity.getId()),
无效的
additionalFilesEntity.getId());
}

如果
JdbcTemplate
是一个选项,则通常应采用以下方法:

使用其中一个变体插入文件。 使用
钥匙夹
获取数据库生成的id

使用产品id和第一步从数据库中获得的id插入对产品的引用。 如果您的数据库支持merge/upsert语句,那么这可能可以在一条语句中完成。 否则,这是两种说法

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

如果您可以使用批更新,那么这应该会更快。 不幸的是,批量更新。 您始终可以在第二步中使用批处理更新。
对于第一个例子,如果您使用UUID,您可能能够在Java端生成id。

您是否考虑过只使用带有简单的
JdbcTemplate的批插入?看起来你在数据库方面做的事情很简单。一个包含数据的JSON进来了。产品列表,其中每个产品都可以有一个文件列表。产品知道文件,但文件不知道产品。如何使用JdbcTemplate实现这一点?此外,对于产品来说,它很可能已经存在,因此只需要更新数据而不是插入。我向我们的架构师提出了这个想法,他说没有。他说使用JdbcTemplates的时间可以追溯到10年前。现在,这是一个有趣的“论点”。他似乎在支持临时桌子。在postgresql中,有一些临时表在事务开始时创建,在事务结束时删除。但是我似乎找不到在JPA中实现这一点的方法。这有点可笑,因为如果您想利用这些数据库细节,JDBC和
JdbcTemplate
将是正确的工具。
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()));
            }