Spring boot api如何防止重复数据创建

问题描述 投票:0回答:2

我有一个POST API来创建一个名为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

谢谢!

spring hibernate jpa
2个回答
3
投票

这种约束只能在数据库层实施。它们无法在应用程序层处理。如果根据您的数据模型,两个人不能具有相同的名称和地址,则可以在数据库中的(名称,地址)上添加唯一约束。

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

有了这样的约束,两个API调用之一将产生一个SQLIntegrityConstraintViolationException,你可以相应地处理。


0
投票

你可以通过两种方式解决它。

  1. 为名称和地址定义唯一键约束
  2. 通过使用existsByNameIgnoreCaseAndAddressIgnoreCase忽略大小写按名称和地址查找人员 class 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); } } }
© www.soinside.com 2019 - 2024. All rights reserved.