Не удалось выполнить оператор;для уникальности DataIntegrityViolationException: - PullRequest
0 голосов
/ 23 ноября 2018

Точная ошибка:

"DataIntegrityViolationException : could not execute statement; SQL [n/a]; constraint [UCIDXNUFQCFS2J6QMVYBIXJFNORH8C]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement (Duplicate entry 'QQAB3GY' for key 'UCIDXNUFQCFS2J6QMVYBIXJFNORH8C')

Мой класс имеет поле id и non-id, которое равно alphanumeric и имеет 5 символов, уникальный и префикс 2 символов:

public class Holiday {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @NotNull
    @Column(unique = true)
    @Size(min = 7, max = 7)
    private String reference;

}

я устанавливаю это поле code в другом сервисе:

@Transactional(isolation = SERIALIZABLE)
@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 final ReferenceGeneratorService referenceGeneratorService;
Holiday holiday = new Holiday();
holiday.setReference(referenceGeneratorService.generateReference(PREAPP));

ДБ mysql, и мы используем spring boot.

Когда я отправляю несколько запросов одновременно, например, от swagger, это может дать

DataIntegrityViolationException , ссылка уже используется

Я много чего перепробовал.

Я открыт для любых предложений.Цель - поле должно быть уникальным и буквенно-цифровым.

Я пробовал это, например:

Приращение строки для буквенно-цифрового поля для JPA не работает

QQ prefix

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