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