当我尝试通过swagger
保存时,会出现以下错误:
INTERNAL_SERVER_ERROR(PERSISTENCE_DATAACCESS_EXCEPTION) - DataIntegrityViolationException : could not execute statement; SQL [n/a]; constraint [UK_8q03as5by8j5kvtroc1dyl0lo]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute
我的课是这样:
public class Book{
@Id
private long id;
@NotNull
@Column(unique = true)
@Size(min = 7, max = 7)
private String referenceCode;;//this field makes the error because of not unique value creation
referenceCode
也是唯一的。我将值保留在另一个表中。并且它还有另一个服务来保存和增加:
@Override
public String generateReference(String productCode) {
ReferenceGenerator referenceGenerator = referenceGeneratorRepository.findByMnemonic(productCode);
if (referenceGenerator != null) {
referenceGenerator.setValue(incrementReference(referenceGenerator.getValue()));
referenceGeneratorRepository.save(referenceGenerator);
}
else {
referenceGenerator = referenceGeneratorRepository.save(new ReferenceGenerator(PREAPP, START_VALUE_FOR_REFERENCE_CODE));
}
return PREFIX_OF_REFERENCE_CODE + referenceGenerator.getValue();
}
private String incrementReference(String value) {
return Long.toString( Long.parseLong(value, 36) + 1, 36).toUpperCase();
}
}
在我的主要服务中,保存时,它使用以下方法:
public class Bookservice{
public void createBook(){
book.setReferenceCode(referenceGeneratorService.generateReference("BOOK));
BookApplication savedBook = bookRepository.save(book);
在swagger
上,当我发送许多保存请求时,有时可能无法保存。由于重复和唯一性。 Concurrency
我该如何预防?
锁或其他东西?我也不想丢失数据。
我可以使用悲观主义锁,但也许还有其他方法吗? 我也可以更改使其独特的方法,但我想保留它。
赞这个 https://stackoverflow.com/a/53259441/10309977
我将synchronized
放到方法中,但我又可以得到错误信息。
@Override
public synchronized String generateReference(String productCode) {
我放在这里。
也许我应该上BookService.java
课?