2017-04-19 71 views
1

跨越這個例子就是在HIbernate commit() and flush()Hibernate會話保存操作與底層數據庫事務同步嗎?

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 


for (int i=0; i<100000; i++) { 
    Customer customer = new Customer(.....); 
    session.save(customer); 
    if (i % 20 == 0) { //20, same as the JDBC batch size 
     //flush a batch of inserts and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 

tx.commit(); 
session.close(); 

我的理解是休眠模式,休眠同步DB會話時,我們做session.save(customer)session.update(....)? 是否只在提交/刷新/刷新時進行升級,而不是在更新/保存時進行升級?

回答

0

Hibernate的Session和JPA EntityManager(又名持久化上下文)的行爲作爲write-behind cache,因此entity state transitions將在清除期間暫存並傳播到數據庫。

默認情況下,commit調用會觸發flush,這是執行INSERT,UPDATE和DELETE語句的時間。

後寫高速緩存的好處是如下:

  • 它更容易申請自動JDBC batch updates
  • ,如果沒有事先的SELECT語句,連接收購可延遲到沖洗,因此減少了數據庫連接租用時間。

有關Hibernate如何工作的更多詳細信息,請查看this tutorial which features over 100 articles關於JPA,Hibernate和最常見的RDBMS。

+0

在我的測試案例中,當我執行'session.save(customer)or session.update(....)'時,我沒有看到任何插入/更新查詢被觸發。它只發生在提交或刷新時發生。所以你的語句'那是INSERT,UPDATE和DELETE語句被執行的時候'。在這裏似乎不正確? – emilly

+0

您確實在確認我的陳述。仔細閱讀 –

0

Hibernate會話的生命週期受到邏輯事務的開始和結束的限制。會話爲映射實體類的實例提供了創建,讀取和刪除操作。 保存/更新/刪除是事務operations.So執行這些操作,有必要與

session.beginTransaction(); 

,然後開始交易只有我們可以執行保存/更新/刪除。 Hibernate提供了高質量的事務回滾機制。 Hibernate會更改數據庫只有當交易通過

session.getTransaction().commit(); 

致力於直到提交被保存/更新執行/刪除將與事務實例,一旦提交方法被調用休眠與數據庫進行交互應用更改。

如果保存/更新/刪除失敗,將執行回滾過程,使數據庫保持不變。

約Hibernate事務研究的更多信息https://www.javatpoint.com/hibernate-transaction-management-example

所以休眠同步與Hibernate的Session數據庫會話,通過提交/平/刷新

相關問題