Точная ошибка:
"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, the reference is already used
Я много чего перепробовал.
Я открыт для любых предложений. Назначение - поле должно быть уникальным и буквенно-цифровым.
Я пробовал это, например:
Приращение строки для буквенно-цифрового поля для JPA не работает
QQ - это prefix
@Anas Я попытался отправить несколько запросов на сохранение, поэтому это происходит из-за этого. Если я отлаживаю, я не могу сделать это так быстро. Отправляю 10-15 запросов за 10 секунд на сохранение. Так что, вероятно, он не может заблокировать базу данных.
Предполагая, что если вы отлаживаете запрос 10 15 и проблема не возникает, это означает, что это проблема параллелизма, и поскольку весенняя загрузка работает с потоками для каждого запроса, можете ли вы попробовать использовать любой параллельный объект? Например ConcurrentHashMap





Ошибка предполагает, что сгенерированный ключ или уникальный столбец имел повторяющуюся запись, вы пытались отладить и проверить, так ли это.