1、延遲加載及其作用
延遲加載,也叫懶加載,是Hibernate爲提高程序執行效率提供的一種機制,即只有真正使用該對象的數據時纔會創建。
Hibernate中主要通過代理(proxy)機制實現延遲加載。
具體過程:
Hibernate從數據庫獲取某一個對象數據,獲取某一個對象的集合屬性值時,或獲取某一個對象所關聯的另一個對象時,由於沒有使用該對象的數據,Hibernate並不是數據庫加載真正的數據,而只是爲該對象創建一個代理對象來代表這個對象,這個對象上的所有屬性值都是默認值;只有在真正需要使用對象的數據時才創建這個真實對象,真正從數據庫中加載它的數據,這樣在某些情況下,就可以提高查詢效率。
有如以下程序代碼:
User user=(User)session.load(User.class,id);//直接返回的是代理對象
System.out.println(user.getId());//沒有發送sql語句到數據庫加載
user.getName();//創建真實的User實例,併發送sql語句到數據庫中
Hibernate默認採用延遲加載的情況主要有一下幾種:
①當調用session上的load()加載一個實體時;
②當session加載某一個實體時,會對這個實體中的集合屬性值採用延遲加載;
③當session加載某一個實體時,會對這個實體所有單端關聯的另一個實體對象採用延遲加載。
2、關閉延遲加載
延遲加載確實會給程序的查詢效率帶來好處,但有時明確知道數據需要立即加載,如果Hibernate先默認使用延遲加載,而後又必須去數據庫加載,反而會降低效率。
①加載單個實體,如果不需要延遲加載,就可以使用session的get()方法;
②當session加載某個實體時,不需要對這個實體中的集合屬性值延遲加載,而是要立即加載,這可以在映射文件中的這個集合配置元素(set,bag,list)添加屬性lazy="false";
③當session加載某個實體時,不需要對這個實體所單端關聯的另一個實體對象延遲加載,可以在映射文件中針對這個單端關聯的配置元素(<one-to-one>,<many-to-one>)添加lazy="false"。