1. 程式人生 > >hibernate進階之路之其他知識(六)

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-onlyread-write。