1. 程式人生 > >Hibernate----一級快取 細節部分

Hibernate----一級快取 細節部分

package com.itheima.b_cache;

import java.util.List;

import org.hibernate.Session;
import org.junit.Test;

import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;
//session快取 的細節問題
public class Demo2 {
    @Test
    //1.儲存物件時使用 save方法
    //  儲存物件時使用 persist方法


    // 區別? 沒有區別
    // persist(持久) 方法 來自於JPA 介面
    // save(儲存) 方法來自於Hibernate
    public void fun1(){
        Session session = HibernateUtils.openSession();
        //session.beginTransaction();
        //------------------------------------------------
        User u = new User();
        u.setName("張三");
        
        //session.save(u); //insert語句被列印=> 目的:獲得id
        session.persist(u); //insert語句被列印=> 目的:獲得id
        //------------------------------------------------
        //session.getTransaction().commit();
        session.close(); // 遊離狀態
    }



    //2.1 HQL查詢是否會使用一級快取? HQL不會使用一級快取.
    @Test
        public void fun2(){
            Session session = HibernateUtils.openSession();
            session.beginTransaction();
            //------------------------------------------------
            
            List<User> list1 = session.createQuery("from User").list();
            List<User> list2 = session.createQuery("from User").list();       
            List<User> list3 = session.createQuery("from User").list();
            //------------------------------------------------
            session.getTransaction().commit();
            session.close(); // 遊離狀態
        }


    //2.2 HQL語句批量查詢時,查詢結果是否會進入快取? 查詢結果會放入快取中
        @Test
            public void fun3(){
                Session session = HibernateUtils.openSession();
                session.beginTransaction();
                //------------------------------------------------               
                List<User> list1 = session.createQuery("from User").list();
                User u = (User) session.get(User.class, 1);
                //------------------------------------------------
                session.getTransaction().commit();
                session.close(); // 遊離狀態
            }



        @Test
        //3.1 SQL查詢 結果會不會放入1級快取中?    如果把查詢結果封裝到物件中,物件會放入一級快取
        public void fun4(){
            Session session = HibernateUtils.openSession();
            session.beginTransaction();
            //------------------------------------------------ 
            List<User> list1 = session.createSQLQuery("select * from t_user").addEntity(User.class).list(); 
            User u = (User) session.get(User.class, 1); 
            System.out.println(u);
            //------------------------------------------------
            session.getTransaction().commit();
            session.close(); // 遊離狀態
        }    
        @Test
        //3.2 SQL查詢 結果會不會放入1級快取中?沒有把查詢結果封裝到物件中,物件不會放入一級快取
        public void fun5(){
            Session session = HibernateUtils.openSession();
            session.beginTransaction();
            //------------------------------------------------
            List list1 = session.createSQLQuery("select * from t_user").list();  
            User u = (User) session.get(User.class, 1); 
            System.out.println(u);
            //------------------------------------------------
            session.getTransaction().commit();
            session.close(); // 遊離狀態
        }    
        
        //criteria => 會將查詢結果放入一級快取. 但是查詢不會使用一級快取. 與Hql查詢結論一致.
}





//產生疑問:

package com.itheima.c_question;

import java.util.List;

import org.hibernate.Session;
import org.junit.Test;

import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;
//2 Hql查詢,查詢結果會放入Session一級快取中.但是每次呼叫Hql查詢都會生成Sql語句?
// 並不代表 Hql沒有使用1級快取. 

public class Demo2 {
    @Test
    public void fun1(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
        List<User> list1 = session.createQuery("from User").list(); // 傳送sql
        
        List<User> list2 = session.createQuery("from User").list();// 傳送sql
        
        System.out.println(list1.get(0)==list2.get(0));//true =>  
        //------------------------------------------------
        session.getTransaction().commit();
        session.close(); // 遊離狀態
    }
    //問題: 快取中的資料如果與資料庫中的不同步,會怎麼樣?
    // 會優先使用快取中的. 使用JDBC
    // 在一級快取中出現該問題的機率比較小.
    //openSession==> 一級快取生命週期開始
    //session.close();=> 一級快取銷燬
    @Test
    public void fun2(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
        
        User u1 = (User) session.get(User.class, 1);
        
        User u2 = (User) session.get(User.class, 1);
        
        //------------------------------------------------
        session.getTransaction().commit();
        session.close(); // 遊離狀態
    }
}
 


query查詢流程圖:::::::