spring-data-jpa 如何在SpringBoot应用程序的多个示例中维护DB表中的唯一记录

kkbh8khc  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(139)

我有一个调度器,它每4小时轮询一次数据,并根据一定的逻辑插入到表中。我还使用了@Transactional注解,而且我每次都在检查数据是否已经存在于表中。如果记录不存在,它将插入。当我是SpringBoot应用程序的多个示例时,每个示例都运行调度程序,但有些数据并不是全部重复。2这意味着我发现表中包含重复记录。3我正在插入的表是应用程序中的现有表,并且有几列没有用唯一约束定义。请建议我如何维护数据库表中的唯一记录,即使调度程序从多个示例运行。我使用的是PostgresqlSpringBoot

x4shl7ld

x4shl7ld1#

因此,您问题的直接答案是为表中的每条记录设置唯一标识符。来自外部API的唯一标识符将是完全匹配的。如果您没有唯一标识符,则可以手动计算它。请考虑以下示例:

@Entity @Table
public class Person {
    private String fieldOne;
    private String fieldTwo;
    @Column(unique=true)
    private String uniqueId;

    //in case you have to generate uniqueId manually
    public static Person fromExternalApi(String fieldOne, String fieldTwo) {
        Person person = new Person();
        person.fieldOne = fieldOne;
        person.fieldTwo = fieldTwo;
        person.uniqueId = fieldOne + fieldTwo;
    }
}

然后,您将在数据库端基于uniqueId字段创建唯一索引,并且数据库将防止重复。
重要提示-您不能使用

@GeneratedValue(strategy = GenerationType.IDENTITY)

因为每次您将对象保存到DB时,它都会生成新id在这种情况下,您可以从不同示例中多次保存同一对象

**但对于您的情况,我建议另一种解决方案。**方法是只运行一次计划任务。此问题已得到解答here

相关问题