我有一个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
谢谢!
这种约束只能在数据库层实施。它们无法在应用程序层处理。如果根据您的数据模型,两个人不能具有相同的名称和地址,则可以在数据库中的(名称,地址)上添加唯一约束。
ALTER TABLE person
add CONSTRAINT person_name_address UNIQUE (name, address);
有了这样的约束,两个API调用之一将产生一个SQLIntegrityConstraintViolationException
,你可以相应地处理。
你可以通过两种方式解决它。
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);
}
}
}