Hibernate一級緩存


 

1. Hibernate一級緩存

Hibernate的一級緩存就是指session緩存。

 

actionQueue它是一個行列隊列,它主要記錄crud操作的相關信息

persistenceContext它是持久化上下文,它其實是真正緩存。

session中定義了一系列的集合來存儲數據,它們構成session緩存。

只要session沒有關閉,它就會一直存在。

當我們通過hibernate中的session提供的一些API例如 save  get  update等進行操作時,就會將持久化對象保存到session中,當下一次在去查詢緩存中具有的對象(OID值來判斷)

就不會去從數據庫查詢,而是直接從緩存中獲取。

Hibernate的一級緩存存在的目的就是為了減少對數據庫訪問。

 

hibernate中還有一個二級緩存,它是SessionFactory級別緩存。

 

1.1.一級緩存的存在

通過第八行斷點,進行查看

 

1.2. 持久化對象具有自動更新數據庫能力(快照更新)

    // 測試一級緩存
    @Test
    public void test3() {
        // 1.得到session
        Session session = HibernateUtils.openSession();
        session.beginTransaction();

        Customer c = session.get(Customer.class, 1); // 查詢id=1的customer對象,如果查詢到,會將c存儲到一級緩存中。
        Customer cc = session.get(Customer.class, 1); // 會從一級緩存
                                                        // 中查詢,而不會向數據庫在發送sql

        // 2.事務提供,關閉
        session.getTransaction().commit();
        session.close();
    }
// 持久化對象具有自動更新數據庫能力
    @Test
    public void test4() {
        // 1.得到session
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        Customer c = session.get(Customer.class, 1); // 查詢id=1的customer對象,如果查詢到,會將c存儲到一級緩存中。
        c.setName("tom"); // 操作持久化對象來修改屬性
        // 2.事務提供,關閉
        session.getTransaction().commit();
        session.close();
    }

 

 

為什么持久化對象具有自動更新數據庫能力?

 

 
 

 

1.3. 一級緩存常用API

一級緩存特點:

當我們通過sessionsave,update saveOrupdate進行操作時,如果一級緩存中沒有對象,會將這些對象從數據庫中查詢到,存儲到一級緩存。

當我們通過sessionload,get,Querylist等方法進行操作時,會先判斷一級緩存中是否存在,如果沒有才會從數據庫獲取,並且將查詢的數據存儲到一級緩存中。

當調用sessionclose方法時,session緩存清空。

 

clea()r 清空一級緩存.

evict(object) 清空一級緩存中指定的一個對象。

      refresh()重新查詢數據庫,用數據庫中信息來更新一級緩存與快照

        close();關閉session時也會清空一級緩存

 
 
 

1.4. Hibernate常用API-Session補充

update

udpate操作它主要是針對於脫管對象,持久對象具有自動更新能力。

問題1:如果我們直接操作的對象是一個脫管對象,執行update會出現什么情況?

Update操作時,如果對象是一個脫管對象,可以操作,

它會將脫管對象轉換成持久對象在操作

如果在session中出現相同的oid兩個對象,會產生異常

問題2脫管對象的oid如果在數據表中不存在,會報異常?

 

所以:在操作中,建議我們通過持久化對象來直接修改其操作。

 

// 測試一級緩存操作常用API
    @Test
    public void test5() {
        // 1.得到session
        Session session = HibernateUtils.openSession();
        session.beginTransaction();

        // 操作
        List<Customer> list = session.createQuery("from Customer").list(); // 會存儲數據到一級緩存
        session.clear(); // 清空一級緩存
        Customer c = session.get(Customer.class, 1); // 會先從session一級緩存
                                                        // 中獲取,如果不存在,才會從數據庫獲取
        session.evict(c); // 從一級緩存 中刪除一個指定的對象
        Customer cc = session.get(Customer.class, 1);

        cc.setName("kkkk");

        session.refresh(cc); // 重新查詢數據庫,用數據庫中信息來更新一級緩存與快照

        // 2.事務提供,關閉
        session.getTransaction().commit();
        session.close();
    }

    // session的update操作


@Test
    public void test6() {
        // 1.得到session
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        //得到id=1的 Customer對象
        //Customer cc=session.get(Customer.class, 1); //session一級緩存中存在了一個oid為1的Customer

        // 執行update來操作一個脫管對象
        Customer c = new Customer();
        c.setAddress("廣州");
        c.setName("趙六");
        c.setId(11);

        session.update(c); //當執行update時會將c放入到session一級緩存

        // 2.事務提供,關閉
        session.getTransaction().commit();
        session.close();
    }

saveOrUpdate

如果對象是一個瞬時對象 --------執行save操作

如果對象是一個脫管對象---------執行update

如果是一個持久對象-------直接返回

delete

刪除一個脫管對象,與session關聯,在刪除

注意:如果執行delete操作,先刪除一級緩存,在刪除數據庫中的數據。

 

// session的update操作
    @Test
    public void test6() {
        // 1.得到session
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        //得到id=1的 Customer對象
        //Customer cc=session.get(Customer.class, 1); //session一級緩存中存在了一個oid為1的Customer

        // 執行update來操作一個脫管對象
        Customer c = new Customer();
        c.setAddress("廣州");
        c.setName("趙六");
        c.setId(11);

        session.update(c); //當執行update時會將c放入到session一級緩存

        // 2.事務提供,關閉
        session.getTransaction().commit();
        session.close();
    }

 

 

 

 

saveOrUpdate

如果對象是一個瞬時對象 --------執行save操作

如果對象是一個脫管對象---------執行update

如果是一個持久對象-------直接返回

delete

刪除一個脫管對象,與session關聯,在刪除

注意:如果執行delete操作,先刪除一級緩存,在刪除數據庫中的數據。

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM