2015-05-06 3 views
0

Вот простой спящий код, который вставляет значение в таблицу. Если строка уже существует, запросите строку и верните данные. В большинстве случаев код работает нормально, без проблем.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(); 
    } 
} 

ответ

0

Основной (или) составной ключ делает уникальные данные каждой строки и позволяет избежать этой ошибки.

Если вам нужны данные из всех этих трех запросов, создайте в своей таблице уникальный первичный ключ и добавьте его в объект.

Первичный ключ может быть любой уникальной вещью из ваших данных, автоматически сгенерированной последовательности или UUID/GUID.

Смежные вопросы