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查詢流程圖:::::::