Hibernate第七篇【對象狀態、一級緩存】

前言

本博文主要講解Hibernate的細節—->對象的狀態和一級緩存數據庫

對象狀態

Hibernate中對象的狀態:
- 臨時/瞬時狀態
- 持久化狀態
- 遊離狀態緩存

學習Hibernate的對象狀態是爲了更清晰地知道Hibernate的設計思想,以及是一級緩存的基礎…固然啦,也就一點點知識markdown

臨時/瞬時狀態

當咱們直接new出來的對象就是臨時/瞬時狀態的..session

  • 該對象尚未被持久化【沒有保存在數據庫中】
  • 不受Session的管理

這裏寫圖片描述

持久化狀態

當保存在數據庫中的對象就是持久化狀態了學習

  • 當調用session的save/saveOrUpdate/get/load/list等方法的時候,對象就是持久化狀態
  • 在數據庫有對應的數據
  • 受Session的管理
  • 當對對象屬性進行更改的時候,會反映到數據庫中!

這裏寫圖片描述

咱們來測試一下:當對對象屬性進行更改的時候,會反映到數據庫中!測試

session.save(idCard);
        idCard.setIdCardName("我是測試持久化對象");

這裏寫圖片描述

遊離狀態

當Session關閉了之後,持久化的對象就變成了遊離狀態了…spa

  • 不處於session的管理
  • 數據庫中有對應的記錄

這裏寫圖片描述


一級緩存

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.flush(); 讓一級緩存與數據庫同步
  • session.evict(arg0); 清空一級緩存中指定的對象
  • session.clear(); 清空一級緩存中緩存的全部對象

  • clear

User user = null;
        user = (User) session.get(User.class, 1);

        //清除緩存,那麼下面獲取的時候,就不能從緩存裏面拿了
        session.clear();
        user = (User) session.get(User.class, 1);
  • flush

在有緩存的狀況下,修改同一條記錄的數據,以最後的爲準…所以只有一條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可能就崩了

  • 每隔必定記錄數,先與數據庫同步 flush()
  • 再清空緩存 clear()

值得注意的是:不一樣的Session是不會共享緩存的!

Iterator與list

咱們使用HQL查詢所有數據的時候,可使用list()獲得全部的數據,也可使用iterator()獲得一個迭代器,再遍歷迭代器…那它們有什麼區別呢?

。。。。當時看視頻的時候說是下圖:

這裏寫圖片描述

可是我在測試的時候:List也能夠獲取緩存的數據

這裏寫圖片描述

固然啦,Iterator也是能夠獲取緩存的數據

這裏寫圖片描述

所以,在獲取數據的時候仍是使用list()方便!

相關文章
相關標籤/搜索