При высокой степени параллелизма приложение активирует уникальные ограничения при сохранении новых данных. Таким образом, у нас есть механизм повтора для повторного получения данных из БД, и если данные уже присутствуют, мы не будем сохранять их снова.
Но в логике повтора при попытке получить данные из postgresDB мы получаем следующую ошибку:
ОШИБКА: HHH000099: произошел сбой утверждения (это может указывать на ошибку в Hibernate, но, скорее всего, связано с небезопасным использованием сеанса): org.hibernate.AssertionFailure : нулевой идентификатор в записи io.cred.rj.demo.entity.Merchant (не очищать сеанс после возникновения исключения)
Повторная попытка работала изначально, но теперь всегда получаю ошибку сбоя утверждения.
Я пытался перехватить конкретное исключение, а также выполнить откат, если произошло нарушение целостности данных. Но после исключения uniqueconstraint каждый раз при извлечении БД возникает ошибка AssertionFailure при переходе в спящий режим.
Пример кода:
public void cleanseMerchant(Merchant description, String mcc) {
try {
updateOrAddMerchant(description,mcc );
}catch(Exception e) {
//Retrying again
updateOrAddMerchant(description,mcc );
}
}
public void updateOrAddMerchant(Merchant description, String mcc) {
Merchant merchant=merchantDao.findByDescAndMcc(description,mcc);
if(merchant == null) {
Merchant merchant = new Merchant();
merchant.setMerchantDesc(description);
//set other fields
merchantDao.save(merchant);
}else {
updateMerchantInfo();
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... -exception