本博文主要講解Hibernate的細節—->對象的狀態和一級緩存…數據庫
Hibernate中對象的狀態:
- 臨時/瞬時狀態
- 持久化狀態
- 遊離狀態緩存
學習Hibernate的對象狀態是爲了更清晰地知道Hibernate的設計思想,以及是一級緩存的基礎…固然啦,也就一點點知識markdown
當咱們直接new出來的對象就是臨時/瞬時狀態的..session
當保存在數據庫中的對象就是持久化狀態了學習
咱們來測試一下:當對對象屬性進行更改的時候,會反映到數據庫中!測試
session.save(idCard); idCard.setIdCardName("我是測試持久化對象");
當Session關閉了之後,持久化的對象就變成了遊離狀態了…spa
Hibernate有一級緩存和二級緩存之分,這裏主要講解一級緩存hibernate
Hibenate中一級緩存,也叫作session的緩存,它能夠在session範圍內減小數據庫的訪問次數! 只在session範圍有效! Session關閉,一級緩存失效!設計
只要是持久化對象狀態的,都受Session管理,也就是說,都會在Session緩存中!code
Session的緩存由hibernate維護,用戶不能操做緩存內容; 若是想操做緩存內容,必須經過hibernate提供的evit/clear方法操做。
減小對數據庫的訪問次數!從而提高hibernate的執行效率!
咱們來看一下Hibernate是怎麼減小對數據庫訪問的次數的。
如今個人User表有這麼一條記錄:
//把數據放進cache User user = (User) session.get(User.class, 1); //發現要修改的字段和cache同樣,不執行 user.setUserName("你好2");
取數據也是同樣的
User user = null; user = (User) session.get(User.class, 1); user = (User) session.get(User.class, 1);
和緩存有關經常使用的方法有三個:
session.clear(); 清空一級緩存中緩存的全部對象
clear
User user = null; user = (User) session.get(User.class, 1); //清除緩存,那麼下面獲取的時候,就不能從緩存裏面拿了 session.clear(); user = (User) session.get(User.class, 1);
在有緩存的狀況下,修改同一條記錄的數據,以最後的爲準…所以只有一條update
User user = null; user = (User) session.get(User.class, 1); user.setUserName("我是第一"); user = (User) session.get(User.class, 1); user.setUserName("我是第二");
我讓強制讓它和數據庫同步的話,就有兩條update了
User user = null; user = (User) session.get(User.class, 1); user.setUserName("我是第一"); session.flush(); user = (User) session.get(User.class, 1); user.setUserName("我是第二");
通常地,咱們在批處理的時候會用,由於緩存也是有大小的,若是1000條數據插入進去都要緩存,那麼Hibernate可能就崩了…
值得注意的是:不一樣的Session是不會共享緩存的!
咱們使用HQL查詢所有數據的時候,可使用list()獲得全部的數據,也可使用iterator()獲得一個迭代器,再遍歷迭代器…那它們有什麼區別呢?
。。。。當時看視頻的時候說是下圖:
可是我在測試的時候:List也能夠獲取緩存的數據
固然啦,Iterator也是能夠獲取緩存的數據
所以,在獲取數據的時候仍是使用list()方便!