Вот простой спящий код, который вставляет значение в таблицу. Если строка уже существует, запросите строку и верните данные. В большинстве случаев код работает нормально, без проблем.Spring3/Hibernate AssertionFailure
В очень особенном случае три разных клиента пытаются вставить точно такую же строку в таблицу. Конечно, только одна строка вставлена. Остальные две вставки терпят неудачу и попадают в блок try-catch.
В блоке try catch есть запрос, который запрашивает данные и отправляет это значение клиенту. Это приводит к ошибке для последующих операций в сеансе.
Hibernate бросает «ERROR org.hibernate.AssertionFailure - утверждение отказа произошедшего (это может указывать на ошибку в Hibernate, но более вероятно, из-за небезопасное использование сессии)» в журналах.
Вот код. Каким будет правильный способ справиться с этим сценарием?
@Override
public void addPackage(PackageEntity pkg) {
try{
getCurrentSession().save(pkg);
getCurrentSession().flush();
}catch(ConstraintViolationException cve){
// UNIQ constraint is violated
// query now, instead of insert
System.out.println("Querying again because of UNIQ constraint : "+ pkg);
PackageEntity p1 = getPackage(pkg.getName(), pkg.getVersion());
if(p1 == null){
// something seriously wrong
throw new RuntimeException("Unable to query or insert " + pkg);
}else{
pkg.setId(p1.getId());
}
}catch (Exception e) {
e.printStackTrace();
}catch (Throwable t) {
t.printStackTrace();
}
}