Spring Boot API如何防止重复数据创建

时间:2019-03-24 01:52:35

标签: spring hibernate jpa

我有一个POST API创建一个名为Person的实体,然后检查是否存在具有名称和地址的person,如果不存在,则创建一个person实体:

class Person {
    UUID id
    String name;
    String address
}

public void createPerson(String name, String addr){
    Person p = repository.findPersonByNameAndAddress(name, addr);
    if (p != null) {
        repository.create(name, addr);
    }
}

如果客户端同时用相同的数据调用POST,我最终将创建两个具有相同名称和地址(但ID不同)的人。如何防止这种情况发生? 我正在使用Spring Boot + JPA / Hibernate + Postgres

谢谢!

2 个答案:

答案 0 :(得分:3)

只能在数据库层强制执行此类约束。它们不能在应用程序层进行处理。如果按照您的数据模型,两个人不能使用相同的姓名和地址,则可以在数据库中对(姓名,地址)添加唯一约束。

ALTER TABLE person
  add CONSTRAINT person_name_address UNIQUE (name, address);

在这种约束下,两个API调用之一将导致SQLIntegrityConstraintViolationException,您可以据此进行处理。

答案 1 :(得分:0)

您可以通过两种方法之一对其进行修复。

  1. 为名称和地址定义唯一的键约束
  2. 通过使用existByNameIgnoreCaseAndAddressIgnoreCase忽略大小写查找姓名和地址的人

    PersonDao类

     public void createPerson(String name, String addr){
            boolean isExists = repository.existsByNameIgnoreCaseAndAddressIgnoreCase(name, addr);
            if (!isExists) {
                PersonEntity person = new PersonEntity();
                person.setName(name);
                person.setAddress(addr);
                repository.save(person);
            }
        }
    }