我有一个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
谢谢!
答案 0 :(得分:3)
只能在数据库层强制执行此类约束。它们不能在应用程序层进行处理。如果按照您的数据模型,两个人不能使用相同的姓名和地址,则可以在数据库中对(姓名,地址)添加唯一约束。
ALTER TABLE person
add CONSTRAINT person_name_address UNIQUE (name, address);
在这种约束下,两个API调用之一将导致SQLIntegrityConstraintViolationException
,您可以据此进行处理。
答案 1 :(得分:0)
您可以通过两种方法之一对其进行修复。
通过使用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);
}
}
}