小编Gia*_*uro的帖子

如何使用jpa存储库saveAll忽略保存操作的重复插入?

我需要能够使用 spring 数据 CrudRepository 的 saveAll() 方法并忽略对唯一约束的重复插入。

在我当前的项目中,我目前正在使用 spring boot -> jpa stack,我必须处理一个 excel 文件的导入,该文件最终将多个实体保存到数据库中。我正在使用 liquibase 来跟踪数据库上的更改,并且我正在使用 spring 配置文件来管理两种不同的环境(一种使用 Postgres DB,另一种使用 Oracle 19-c)。excel 文件不时通过外部 ftp 服务上传。我有一个文件夹监视服务,它等待该文件夹中的文件更改并在创建新文件时触发导入。

问题是我有一个唯一的约束,文件可能有新行和旧行。通过 POI 对 Excel 文件的处理非常繁重,我通过 java.util.Set 将计算结果保存在内存中,直到到达必须使用 saveAll() 方法保存 Set 的时间点CrudRepository。

我目前遇到错误:重复键值违反唯一约束“csspd_avoid_duplicates”

org.springframework.transaction.UnexpectedRollbackException:事务静默回滚,因为它已被标记为仅回滚

并且导入在第一个遇到的重复项上停止。

对于同一个项目,我在循环中的单个插入(单个 save())中遇到了类似的问题,我已经设法使用以下代码段解决了该问题:

                try {

                    repository.save(entity);
                } catch (DataIntegrityViolationException e) {
                    this.log.debug("Duplicate found, skipping");
                }
Run Code Online (Sandbox Code Playgroud)

我已经尝试了与批量保存相同的方法,但没有任何运气。

这是感兴趣的方法:

public boolean triggerExcelImport(Path path) {
    try {

        ExcelDataDTO excelExtractedData;
        if (path == null) {
            excelExtractedData = excelImporterService.importExcelFiles();
        } else {
            excelExtractedData = …
Run Code Online (Sandbox Code Playgroud)

java exception jdbc upsert spring-data-jpa

8
推荐指数
1
解决办法
4494
查看次数

标签 统计

exception ×1

java ×1

jdbc ×1

spring-data-jpa ×1

upsert ×1