2015-06-27 2 views
0

У меня есть требование, когда я обновляю строки в соответствии с uuid, где один uuid может быть связан с несколькими строками.Обновление Hibernate иногда не работает

Вот сценарий: 4a90558c-4a5b-4af7-8c68-60ff81f74ef3 - это мой uuid и он существует в 8 столбцах моей БД.

и мой Java-код выглядит следующим образом:

try{ 
     session = sessionFactory.getCurrentSession(); 
     tx = session.getTransaction(); 
     criteria = session.createCriteria(Archive.class); 
     criteria.add(Restrictions.eq("bagUuid", "4a90558c-4a5b-4af7-8c68-60ff81f74ef3")); 
     ScrollableResults items = criteria.scroll(); 

     while (items.next()) { 
      Archive archive = (Archive)items.get(0); 
      archive.setDecision(1); 
      archive.setOperatorAssigned("test"); 
      session.saveOrUpdate(archive); 
      session.flush(); 
      session.clear(); 
     } 
     tx.commit(); 
     LOGGER.info("Archive Record is updated: "+archive.getFilePath()); 
    }catch(Exception e){ 
     recordUpdated = false; 
     tx.rollback(); 
     LOGGER.error("Archive Record failed to update due to exception in updateArchiveRecord method: "+e.getMessage()); 
    } 

Здесь иногда все записи, связанные с UUID обновляется, но иногда не удается. Я думаю, что это может быть проблемой с Hibernate API. С кем-то сталкивается одна и та же проблема.

+0

Если кто-то сказал вам, что что-то не удалось, что бы ваш следующий вопрос? Скорее всего, это было бы так: в каком случае это провалилось? Он игнорировал обновления или выдавал исключение? Если это исключение, что бы вы спросили дальше? Возможно: какое исключение? –

+0

использовать 'e.printStackTrace();' в catch –

+0

Никаких исключений вообще. иногда он обновляет 8, иногда 2, а иногда 3 – subhfyu546754

ответ

2

Эта линия выглядит подозрительно:

Archive archive = (Archive)items.get(0); 

Это означает thart независимо от количества элементов в ScrollableResults, вы будете обновлять только первый объект архива. Если бы я понял, что вы пытаетесь сделать правильно, она должна быть текущая запись:

Archive archive = (Archive)items.get(); 

Кроме того, я бы съехать/удалить session.flush() и session.clear(). Окончательный код будет выглядеть следующим образом:

try{ 
    session = sessionFactory.getCurrentSession(); 
    tx = session.getTransaction(); 
    criteria = session.createCriteria(Archive.class); 
    criteria.add(Restrictions.eq("bagUuid", "4a90558c-4a5b-4af7-8c68-60ff81f74ef3")); 
    ScrollableResults items = criteria.scroll(); 

    while (items.next()) { 
     Archive archive = (Archive)items.get(); 
     archive.setDecision(1); 
     archive.setOperatorAssigned("test"); 
     session.saveOrUpdate(archive); 
    } 
    tx.commit(); 
    session.close(); 
    LOGGER.info("Archive Record is updated: "+archive.getFilePath()); 
}catch(Exception e){ 
    recordUpdated = false; 
    tx.rollback(); 
    LOGGER.error("Archive Record failed to update due to exception in updateArchiveRecord method: "+e.getMessage()); 
} 

Slava Imeshev

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