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
一級緩存特點:
當我們通過session的save,update saveOrupdate進行操作時,如果一級緩存中沒有對象,會將這些對象從數據庫中查詢到,存儲到一級緩存。
當我們通過session的load,get,Query的list等方法進行操作時,會先判斷一級緩存中是否存在,如果沒有才會從數據庫獲取,並且將查詢的數據存儲到一級緩存中。
當調用session的close方法時,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操作,先刪除一級緩存,在刪除數據庫中的數據。