hibernate進階之路之其他知識(六)
之前幾篇部落格簡單介紹了hibernate基本知識,和幾種常見的對映,還有一些不常用的對映例如:繼承對映、複合主鍵對映等就不介紹了。本篇部落格講介紹hibernate其他的一些常用知識。
一、lazy策略
lazy懶載入可以提高效率,在真正使用的時候再去建立,再發出sql語句載入該物件,提升了效能。
lazy有以下策略:
1、lazy可以在對映檔案的<class>標籤上,取值為true/false;
2、lazy可以在對映檔案的<property>標籤上,取值為true/false;
3、lazy可以在對映檔案的<set>標籤上,取值為true/false/extra;
4、lazy可以在對映檔案的<many-to-one>/<one-to-one>單端關聯的標籤上,取值為false/proxy/noproxy;
lazy只有session.load()方法支援,get不支援。在load方法執行的時候不會發出sql語句,在查詢的實體真正用的時候才會,
例如user.getName()會發出sql語句,然後結果會放在快取中,之後就可以不發出sql語句了。
注意,lazy只有在session開啟的時候才可以使用,關閉了會報 LazyInitializationException:19 - could not initialize proxy
- the owning Session was closed的錯誤。
二、hql語句
hql是面向物件的方式生成sql,用類和屬性代替表和欄位,支援多型,支援關聯查詢;支援關係型資料庫的操作, 連線:join、投影:projection;聚合:avg、max;分組:group;排序:ordering;子查詢:subqueries;等。 可以查詢到指定屬性:List students=session.createQuery("select id,name from Student").list();
條件查詢:
強型別查詢://可以拼串 List students = session.createQuery("select s.id, s.name from Student s where s.name like '%0%'").list();
//可以使用hql返回Student物件
//需要提供建構函式
List students = session.createQuery("select new Student(id, name) from Student").list();
導航查詢:
List students = session.createQuery("from Student s where s.classes.name like '%2%'").list();
關聯查詢:
List students = session.createQuery("select c.name, s.name from Student s join s.classes c").list();
分頁查詢:
List students = session.createQuery("from Student").setFirstResult(1).setMaxResults(2).list();
三、鎖 悲觀鎖:LockMode只是在使用Hibernate 中 的session.load()載入資料時指定的模式,也叫悲觀鎖(模式), 然而,悲觀鎖是為了彌補read-committed 機制的不足,從而解決non-repeatable (不可重複讀)和 phantom-read (幻讀)問題。
鎖定模式: 使用方法: session.load(Student.class,1001,LockMode.UPGRADE); 四、快取 1、一級快取 快取是快取的實體物件,一級快取生命週期和session的生命週期一致,一級快取預設開啟,也叫session級別快取或者事務級快取。 load/get/iterate查詢實體物件都支援一級快取,如果是大批量的資料更新操作,要每個20或者30次更新執行一遍session.flush();session.close();清除快取。 2、二級快取
二級快取也稱為程序級的快取或SessionFactory級的快取,二級快取可以被所有的session共享,
二級快取的生命週期和SessionFactory的生命週期一致,SessionFactory可以管理二級快取。
二級快取的配置和使用,採用第三方快取框架ehcache:
* 將ehcache.xml檔案拷貝到src下
* 在hibernate.cfg.xml檔案中加入快取產品提供商
<!-- 配置快取提供商 -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<!-- 啟用二級快取,這也是它的預設配置 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<mapping resource="com/tgb/hibernate/Student.hbm.xml"/>
<mapping resource="com/tgb/hibernate/Classes.hbm.xml"/>
<!--
指定Student使用二級快取,也可以在student的對映檔案中<cache/>配置
-->
<class-cache class="com.tgb.hibernate.Student" usage="read-only"/>
注意使用的策略,通常採用read-only和read-write。