我正在使用Spring Data JPA存储库。我有一个服务(带有@Tranasctional
),该服务接受一些数据并将其保存到数据库(使用JpaRepository
)。如果为数据库中的字段设置的任何唯一约束失败,则数据库将触发ConstraintViolationException
。现在,我想查询数据库,以找出保存数据时违反了唯一字段中的哪个。从某种意义上说,我的服务的save方法是这样的:
@Transactional
public void saveData(MyDto data) {
MyEntity entity = new MyEntity();
entity.setName(data.getName());
entity.setEmail(data.getEmail()); // has unique constraint set
entity.setPhoneNumber(data.getPhoneNumber()); //// has unique constraint set
try {
// repository is injected and extends JpaRepository
repository.save(entity);
} catch(Exception ex) {
//Check if email exists
int val = repository.checkIfEmailExists(data.getEmail());
if(val > 0) {
throw new UserEmailExitsException();
}
//Check if phone number exists
val = repository.checkIfPhoneNumberExists(data.getPhoneNumber());
if(val > 0) {
throw new UserPhoneNumberExistsException();
}
// Not the case, throw catched exception
throw ex;
}
}
问题在于,调用repository.checkIfEmailExists(data.getEmail())
将触发另一个异常,提示null id in "MyEntity" (don't flush the Session after an exception occurs)
。为什么会这样?
在性能问题上,我不想在致电save
之前查询数据库。我只想查询发生ConstraintViolationException
的情况。