2012-10-02 122 views
2

我手動創建了我的數據庫,然後使用Hibernate工具來生成我的Pojo,DAO。 當我創建一個對象,並堅持到數據庫中它似乎做工精細休眠後沒有刷新數據庫()

 DefinitionT def = new DefinitionT(); 
     def.setSelected(false); 
     def.setValue(sqlEncode(definition)); 
     def.setWordId(wordT.getId()); 
     definitionTDao.persist(def); 

這是我的堅持()方法

public void persist(Object o) 
{ 
    try 
    { 
     hSession.persist(o); 
     hSession.flush(); 
    } 
    catch (Exception e) 
    { 
     hTransaction.rollback(); 
     log.error(e.getMessage()); 
    } 
} 

當我的線程完成數據庫與新對象更新。但是,我注意到,如果我在調用persist()後直接停止該程序,數據庫將不會被更新。事實上,無論有多少操作我都不會在數據庫中更新,直到線程完成。我認爲flush()將hibernate緩存中的所有更新都推送到數據庫中? 我錯過了什麼?我認爲這與Hibernate flush doesn't update database的問題相同,但我沒有任何for循環。

回答

1

怎麼樣,如果你提交交易明確:

Transaction hTransaction = null; 
try { 
hTransaction = hSession.beginTransaction(); 

hSession.persist(o); 


hTransaction.commit(); 
hSession.flush(); 

} 
catch (Exception e) 
{ 
    hTransaction.rollback(); 
    log.error(e.getMessage()); 
} 

其實據我知道,當你沖洗會話,與本次會議應致力於打開的任何交易,但這種檢查,確保你正在創建與您正在沖洗的會話進行交易。

只是檢查自動沖水,當你你提交,模式應該是:

hSession.setFlushMode(FlushMode.COMMIT) 

檢查從here

7

沖洗意味着Hibernate的Session最終訂單的SQL語句,然後將它們發送到數據庫。然後數據庫執行它們(在回滾段中),但不會使修改持久化,但它們不會讓其他用戶可用。

一個提交最終讓數據庫持久地存儲修改。 (例外情況是數據庫處於自動提交模式 - 我不推薦這樣做,因爲交易的正確性無法保證,並且自動提交不適用於所有數據庫,或者如果刷新模式設置爲提交 - 也不會有必要;這就失去了靈活性。)

一個提交隱含地調用一個flush(),但是flush不會調用commit()。

爲您提供的解決方案:在程序結束時執行額外的提交。 (順便說一句,每次交易後通常都會執行刷新操作,但爲了獲得更好的性能,交易只會在多次交易後完成)。