Блокировка репозитория, чтобы позволить писать только один процесс - PullRequest
0 голосов
/ 15 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...