Hibernate中flush機制的詳細理解
針對昨天同事遇到的hibernate的問題。算是hibernate最基本的東西。具瞭解,這個問題很多人遇到過,也很常見,卻遇到了還經常會懵了。
為了加深印象,知其然,知其所以然。
之後單純用原始的Hibernate框架做了一些驗證,並且開啟執行SQL列印輸出臺的,得出的結論:
前提是在同一事務中間:
1、利用sql語句, session.createSQLQuery(sql).executeUpdate();進行插入,輸出臺列印出sql插入語句; 再利用sql語句,進行session.createSQLQuery(sql).uniqueResult(); 也會列印SQL查詢語句,沒有問題,可以查詢到資料。
2、利用hibernate封裝操作, session.save(entity); 進行插入,輸出臺並沒有列印出插入的SQL語句, 再利用 session.get(entity,id);方法做查詢 ;也沒有列印出SQL查詢語句,但是是可以查詢到資料的。到執行事務提交語句時,插入的SQL語句被列印出來
3、利用hibernate的session.save(entity); 進行插入,再利用《HQL》語句進行查詢,效果同上面第二點。
4、利用hibernate的session.save(entity); 進行插入,輸出臺並沒有列印出插入的SQL語句。 再利用sql語句,進行session.createSQLQuery(sql).uniqueResult(); 會列印SQL查詢語句。問題出現了,查詢不到任何資料。這種情況下利用session.flush()方法,在查詢之前執行到flush()方法,輸出臺會列印出插入的SQL語句。 再進行查詢就有資料。
驗證完成之後,查了下往上資料,對於第四點,在開發過程中出現頻繁,非常的常見,相信很多人都曾遇到,但又有很多人繼續摸不到頭腦。正好以此加深了印象。
從列印控制檯SQL可以看出一個基本的hibernate save方法的操作流程:
1. 判斷所要儲存的例項是否已處於持久化狀態,如果不是,則將其置入快取;
2. 根據所要儲存的例項計劃一條insert sql語句,注意只是計劃,並不執行;
3. 事務提交時執行之前所計劃的insert語句;
將tx.commit()換成session.flush,此時控制太列印出了insert語句,但是資料庫中並沒有新增新的記錄;
flush方法的主要作用就是清理快取,強制資料庫與Hibernate快取同步,以保證資料的一致性。它的主要動作就是向資料庫傳送一系列的sql語句,並執行這些sql語句,但是不會向資料庫提交。而commit方法則會首先呼叫flush方法,然後提交事務。這就是為什麼我們僅僅呼叫flush的時候記錄並未插入到資料庫中的原因,因為只有提交了事務,對資料庫所做的更新才會被儲存下來。因為commit方法隱式的呼叫了flush,所以一般我們都不會顯示的呼叫flush方法。
這是hibernate的flush機制。在一些複雜的物件更新和儲存的過程中就要考慮資料庫操作順序的改變以及延時flush是否對程式的結果有影響。如果確實存在著影響,那就可以在需要保持這種操作順序的位置加入flush強制Hibernate將快取中記錄的操作flush入資料庫,這樣看起來也許不太美觀,但很有效。
疑問:session.save方法,放入快取中,SQL直接查詢資料庫是查不出來的。
flush()方法之後,會列印出執行SQL,但是資料庫中,還是沒有。SQL直接查詢卻能查出資料來。
1、flush() 之後這個實體資料存放在什麼地方?和save()方法一樣的快取,那SQL也應該是取不到的。
2、既然flush方法之後資料沒有進資料庫,SQL直接查詢,利用session.createSQLQuery(sql) 查詢,直接查得應該不是資料庫,他查詢的又是什麼地方?
相關文章
- Hibernate flush理解
- hibernate快取機制詳細分析快取
- 詳細分析Java中斷機制Java
- Hibernate 所有快取機制詳解快取
- 超詳細的node垃圾回收機制
- 理解的Java中SPI機制Java
- Java 中 Varargs 機制的理解Java
- 深入理解Java中的反射機制和使用原理!詳細解析invoke方法的執行和使用Java反射
- Oracle SCN機制詳細解讀Oracle
- MySQL索引機制(詳細+原理+解析)MySql索引
- 理解JS中的Event Loop機制JSOOP
- Spark Shuffle機制詳細原始碼解析Spark原始碼
- Android事件機制詳細解讀Android事件
- Java中stream流的filter機制理解JavaFilter
- JAVA中的反射機制詳解Java反射
- Nginx 快取機制詳解!非常詳細實用Nginx快取
- HashMap稍微詳細的理解HashMap
- php中關於會話機制的理解PHP會話
- 理解Django 中Call Stack 機制的小DemoDjango
- 深入理解 Java 中 SPI 機制Java
- mysql關於FLUSH TABLES和FLUSH TABLES WITH READ LOCK的理解MySql
- transformer中的attention機制詳解ORM
- jdon框架與hibernate結合的部分在文件中說的不詳細框架
- 深入理解javascript中的繼承機制(1)JavaScript繼承
- 理解Linux 中sed命令的工作機制Linux
- Zookeeper的選舉機制和同步機制超詳細講解,面試經常問到!面試
- 理解 LruCache 機制
- 泊松過程的詳細理解
- 一文了解Python反射機制(很詳細)Python反射
- mysql flush 命令詳解MySql
- Conflux 中的代付機制詳解UX
- 反射機制的簡答理解反射
- 理解storm的ACKER機制原理ORM
- hibernate(七) hibernate中查詢方式詳解
- 史上最詳細的iOS之事件的傳遞和響應機制iOS事件
- hibernate快取機制書目錄快取
- 8.JVM記憶體分配機制超詳細解析JVM記憶體
- C#泛型內部工作機制詳細解析C#泛型