2015-06-27 101 views
0

我有一個要求,我根據uuid的更新行,其中一個uuid可能會關聯到多行。休眠更新有時不起作用

這裏是場景: 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();'捕獲 –

+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()); 
} 

斯拉瓦Imeshev