Когда я пытаюсь сохранить с помощью 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
класс?