hibernate教程--一级缓存详解
1.1?Hibernate的一級緩存
1.1.1?Hibernate的一級緩存:
什么是緩存:
緩存將數據庫/硬盤上文件中數據,放入到緩存中(就是內存中一塊空間).當再次使用的使用,可以直接從內存中獲取.
緩存的好處:
* 提升程序運行的效率.緩存技術是Hibernate的一個優化的手段.
Hibernate分成兩個基本的緩存:
* 一級緩存:Session級別的緩存.一級緩存與session的生命周期一致.自帶的.不可卸載.
* 二級緩存:SessionFactory級別的緩存.不是自帶的.
在 Session 接口的實現中包含一系列的 Java 集合, 這些 Java 集合構成了 Session 緩存. 只要 Session 實例沒有結束生命周期, 存放在它緩存中的對象也不會結束生命周期.
1.1.2?證明Hibernate的一級緩存的存在:
@Test// 證明一級緩存的存在public void demo3(){// 1.創建SessionSession session = HibernateUtils.openSession();// 2.開啟事務Transaction tx = session.beginTransaction();// save方法可以向一級緩存中存放數據的./*Book book = new Book();book.setName("JQuery開發");book.setAuthor("張XX");book.setPrice(45d);Integer id = (Integer) session.save(book);Book book2 = (Book) session.get(Book.class, id);System.out.println(book2);*/// 分別用get執行兩次查詢.Book book1 = (Book) session.get(Book.class, 1);// 馬上發生SQL去查詢System.out.println(book1);Book book2 = (Book) session.get(Book.class, 1);// 不發生SQL,因為使用一級緩存的數據System.out.println(book2);// 3.提交事務tx.commit();// 4.關閉資源session.close();}1.1.3?深入理解一級緩存中快照區:
@Test// 深入理解一級緩存結構:快照區:public void demo4(){// 1.創建SessionSession session = HibernateUtils.openSession();// 2.開啟事務Transaction tx = session.beginTransaction();// 獲得一個持久態的對象.Book book = (Book) session.get(Book.class, 1);book.setName("Spring3開發");// 3.提交事務tx.commit();// 4.關閉資源session.close();}結論:向一級緩存存入數據的時候,放入一級緩存區和一級緩存快照區,當更新了一級緩存的數據的時候,事務一旦提交,比對一級緩存和快照區,如果數據一致,不更新,如果數據不一致,自動更新數據庫.
1.1.4?Hibernate管理一級緩存:
一級緩存是與session的生命周期相關的.session生命周期結束,一級緩存銷毀了.
* clear()/evict()/flush()/refresh()管理一級緩存.
* clear():清空一級緩存中所有的對象.
* evict(Object obj):清空一級緩存中某個對象.
* flush():刷出緩存.
* refresh(Object obj):將快照區的數據重新覆蓋了一級緩存的數據.
1.1.5?Hibernate一級緩存的刷出時機
FlushMode:
* 常量:
* ALWAYS:每次查詢的時候都會刷出.手動調用flush.事務提交的時候.
* AUTO:默認值.有些查詢會刷出.手動調用flush.事務提交的時候.
* COMMIT:在事務提交的時候,手動調用flush的時候.
* MANUAL:只有在手動調用flush才會刷出.
嚴格程度:MANUAL > COMMIT > AUTO > ALWAYS
1.2?操作持久化對象的方法:
save():
保存一條記錄:將瞬時態對象轉成持久態對象.
update()
更新一條記錄:將脫管態對象轉成持久態對象.
在<class>標簽上設置select-before-update="true"在更新之前先去查詢
saveOrUpdate():
根據對象狀態的不同執行不同的save獲得update方法.
* 如果對象是一個瞬時態對象:執行save操作.
* 如果對象是一個脫管態對象:執行update操作.
* 設置id不存在,就會報錯,可以在<id>上設置一個unsaved-value=”-1”,執行保存的操作.
delete():
將持久態對象轉成瞬時態.
get()/load():
獲得一個持久態對象.
總結
以上是生活随笔為你收集整理的hibernate教程--一级缓存详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate教程--一级缓存
- 下一篇: hibernate教程--关联关系的映射