欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Hibernate延遲加載原理與實(shí)現(xiàn)方法

 更新時(shí)間:2016年03月24日 14:05:37   作者:張國(guó)亮  
這篇文章主要介紹了Hibernate延遲加載原理與實(shí)現(xiàn)方法,較為詳細(xì)的分析了Hibernate延遲加載的概念,原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下

本文實(shí)例講述了Hibernate延遲加載原理與實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:

為了進(jìn)一步優(yōu)化Hibernate的性能,可以使用:

延遲加載技術(shù)、管理數(shù)據(jù)抓取策略、進(jìn)行緩存管理 等方面考慮來提高Hibernate的性能。

1. 延遲加載(load)

延遲加載(load)是Hibernate為提高程序執(zhí)行效率而提供的一種機(jī)制,即只有真正使用該對(duì)象的數(shù)據(jù)時(shí)才會(huì)創(chuàng)建。

延遲加載的過程:通過代理(Proxy)機(jī)制來實(shí)現(xiàn)延遲加載。Hibernate從數(shù)據(jù)庫獲取某一個(gè)對(duì)象數(shù)據(jù)時(shí)、獲取某一個(gè)對(duì)象的集合屬性值時(shí),或獲取某一個(gè)對(duì)象所關(guān)聯(lián)的另一個(gè)對(duì)象時(shí),由于沒有使用該對(duì)象的數(shù)據(jù)(除標(biāo)識(shí)符外),Hibernate并不從數(shù)據(jù)庫加載真正的數(shù)據(jù),而只是為該對(duì)象創(chuàng)建一個(gè)代理對(duì)象來代表這個(gè)對(duì)象,這個(gè)對(duì)象上的所有屬性都為默認(rèn)值;只有在真正需要使用該對(duì)象的數(shù)據(jù)時(shí)才創(chuàng)建這個(gè)真正的對(duì)象,真正從數(shù)據(jù)庫中加載它的數(shù)據(jù)。

當(dāng)調(diào)用Session上的load()方法加載一個(gè)實(shí)體時(shí);當(dāng)Session加載某個(gè)實(shí)體時(shí),會(huì)對(duì)這個(gè)實(shí)體中的集合屬性值采用延遲加載;當(dāng)Session加載某個(gè)實(shí)體時(shí),會(huì)對(duì)這個(gè)實(shí)體所單端關(guān)聯(lián)的另一個(gè)實(shí)體對(duì)象采用延遲加載

關(guān)閉延遲加載:在加載單個(gè)實(shí)體時(shí),可以使用get()方法

對(duì)于實(shí)體中的集合屬性,可以在這個(gè)集合的(<set>,<bag>,<list>…)添加屬性lazy="false"。單端關(guān)聯(lián)另一個(gè)實(shí)體對(duì)象時(shí),可以在映射文件中配置<one-to-one>,<many-to-one> 添加屬性lazy="false"注意:one-to-one不能有constrained=true(產(chǎn)生的sql語句中顯示外鍵),否則懶加載不起作用。

2. Hibernate中默認(rèn)采用延遲加載的情況主要有以下幾種:

• 當(dāng)調(diào)用Session上的load()方法加載一個(gè)實(shí)體時(shí)會(huì)采用延遲加載。
• 當(dāng)Session加載某個(gè)實(shí)體時(shí),會(huì)對(duì)這個(gè)實(shí)體中的集合屬性值采用延遲加載。(one-to-many)
• 當(dāng)Session加載某個(gè)實(shí)體時(shí),會(huì)對(duì)這個(gè)實(shí)體所單端關(guān)聯(lián)(one-to-one, many-to-one)的另一個(gè)實(shí)體對(duì)象采用延遲加載。
• 第二種和第三種的區(qū)別是:第二種情況下取消延時(shí)加載的方法是在單方即有set屬性的一方的映射文件的set標(biāo)簽后設(shè)置懶加載的屬性lazy="false";第三種情況則是在多方即有many-to-one的一方的映射文件中的many-to-one標(biāo)簽后設(shè)置lazy="false"。

能夠懶加載的對(duì)象都是被改寫過的代理對(duì)象,當(dāng)相關(guān)聯(lián)的session沒有關(guān)閉時(shí),訪問這些懶加載對(duì)象(代理對(duì)象)的屬性(getId和getClass除外)hibernate會(huì)初始化這些代理,或用Hibernate.initialize(proxy)來初始化代理對(duì)象;當(dāng)相關(guān)聯(lián)的session關(guān)閉后,再訪問懶加載的對(duì)象將出現(xiàn)異常。

3. 抓取策略(fetch)

通過配置"抓取策略"來直接影響session的get()和load()方法的查詢效果。

單端關(guān)聯(lián)<many-to-one><one-to_one>上的抓取策略:

可以給單端關(guān)聯(lián)的映射元素添加fetch屬性。select:延遲加載; join:在同一條select語句使用內(nèi)連接來獲得對(duì)象的數(shù)據(jù)和它關(guān)聯(lián)對(duì)象的數(shù)據(jù),此時(shí)關(guān)聯(lián)對(duì)象的延遲加載失效。

集合屬性上的抓取策略:

select:延遲加載;join:在同一條select語句使用內(nèi)連接來獲得對(duì)方的關(guān)聯(lián)集合。此時(shí)關(guān)聯(lián)集合上的lazy會(huì)失效。subselect:另外發(fā)送一條查詢語句或子查詢抓取。這個(gè)策略對(duì)HQL的查詢也起作用。

4. 延遲加載案例分析

情況一:?jiǎn)蝹€(gè)實(shí)體調(diào)用load()方法取消懶加載

package com.hbsi.test;
import org.hibernate.Session;
import org.junit.Test;
import com.hbsi.domain.User;
import com.hbsi.utils.HibernateUtil;
publicclass TestLazy {
//測(cè)試get()方法;get()方法不管你有沒有用到,總會(huì)執(zhí)行sql語句
@Test
publicvoid testGet(){
Session session = HibernateUtil.getSession();
User user = (User) session.get(User.class,1);
// System.out.println(user.getName());
HibernateUtil.close();
//這里要注意的是:即使關(guān)閉了session,使user處于托管狀態(tài),仍然可以可以使用user對(duì)象;這是因?yàn)殡m然處于托管狀態(tài),但是這個(gè)對(duì)象是存在屬性值的對(duì)象,并沒有把他刪除,只是隔絕了它與數(shù)據(jù)庫的打交道的通道。
System.out.println(user.getName());
}
//測(cè)試load()方法;不執(zhí)行sql語句,用到的時(shí)候才執(zhí)行
@Test
publicvoid testLoad(){
Session session = HibernateUtil.getSession();
User user = (User) session.load(User.class,1);
//這里輸出id也不會(huì)執(zhí)行sql語句,直接從上面你傳進(jìn)去的id中獲取id,沒有從數(shù)據(jù)庫中查找,所以也不執(zhí)行sql語句
System.out.println(user.getId());
//而輸出name就不一樣了,這時(shí)其實(shí)就是實(shí)例化了代理對(duì)象,這是的代理對(duì)象有了name的屬性,這時(shí)即使你關(guān)閉了session,也可以通過這個(gè)對(duì)象獲取到name;如果注釋這句,即不實(shí)例化代理對(duì)象,又在關(guān)閉session后執(zhí)行輸出name屬性,這時(shí)會(huì)報(bào)錯(cuò):could not initialize proxy
// System.out.println(user.getName());
HibernateUtil.close();
System.out.println(user.getName());
}
}

情況二:set集合上取消懶加載

測(cè)試如果在映射文件中將集合屬性中的懶加載設(shè)置為false后將連帶著orders表中數(shù)據(jù)一塊提出來,即兩條select語句

@Test
publicvoid find(){
Session session = HibernateUtil.getSession();
Customer cus = (Customer) session.get(Customer.class,3);
System.out.println(cus.getCname());
//用到下面這種方法輸出會(huì)出現(xiàn)兩天sql語句,而且是分開的;如果用到懶加載會(huì)出現(xiàn)先輸出兩條sql語句,在輸出結(jié)果
//這里不能直接方法鏈?zhǔn)捷敵鯿us.getOrd().getOname();因?yàn)閏us.getOrd()返回的是一個(gè)set集合
Set<Orders> orders = cus.getOrd();
System.err.println(orders.size());
HibernateUtil.close();
}

方法三:<one-to-one>,<many-to-one> 取消懶加載

@Test
publicvoid find(){
//默認(rèn)使用懶加載,即用著一條sql語句就輸出一條;如果設(shè)置延時(shí)加載為false后輸出兩條sql語句,將不需要的顧客信息也查出來
Session session = HibernateUtil.getSession();
Orders ord = (Orders) session.get(Orders.class,3);
System.out.println(ord.getOname());
HibernateUtil.close();
}

希望本文所述對(duì)大家基于Hibernate框架的Java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Java中indexOf()的用法小結(jié)

    Java中indexOf()的用法小結(jié)

    這篇文章主要介紹了Java中indexOf()的用法小結(jié),indexOf()有四種方法,用來查找某個(gè)字符或字符串的位置,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • java針對(duì)于時(shí)間轉(zhuǎn)換的DateUtils工具類

    java針對(duì)于時(shí)間轉(zhuǎn)換的DateUtils工具類

    這篇文章主要為大家詳細(xì)介紹了java針對(duì)于時(shí)間轉(zhuǎn)換的DateUtils工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • springboot自動(dòng)配置沒有生效的問題定位(條件斷點(diǎn))

    springboot自動(dòng)配置沒有生效的問題定位(條件斷點(diǎn))

    這篇文章主要介紹了springboot自動(dòng)配置未生效問題定位,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來學(xué)習(xí)一下吧
    2019-06-06
  • Spring MVC 啟動(dòng)過程源碼分析詳解

    Spring MVC 啟動(dòng)過程源碼分析詳解

    這篇文章主要介紹了Spring MVC 啟動(dòng)過程源碼分析詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • 談?wù)凷pring AOP中@Aspect的高級(jí)用法示例

    談?wù)凷pring AOP中@Aspect的高級(jí)用法示例

    在Spring AOP中目前只有執(zhí)行方法這一個(gè)連接點(diǎn),下面這篇文章主要給大家介紹了關(guān)于Spring AOP中@Aspect的高級(jí)用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • spring中的@Value讀取配置文件的細(xì)節(jié)處理過程

    spring中的@Value讀取配置文件的細(xì)節(jié)處理過程

    這篇文章主要介紹了spring中的@Value讀取配置文件的細(xì)節(jié)處理過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • idea 2023.1字體設(shè)置及自動(dòng)調(diào)整大小的圖文教程

    idea 2023.1字體設(shè)置及自動(dòng)調(diào)整大小的圖文教程

    這篇文章主要介紹了idea 2023.1字體設(shè)置及自動(dòng)調(diào)整大小的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 教你用JAVA寫文本編輯器(二)

    教你用JAVA寫文本編輯器(二)

    之前介紹了JAVA寫文本編輯器的基本思路,下面這篇文章就來給大家介紹了關(guān)于用JAVA寫文本編輯器的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • SpringMVC請(qǐng)求數(shù)據(jù)詳解講解

    SpringMVC請(qǐng)求數(shù)據(jù)詳解講解

    Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級(jí) Web 開發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì),本章來講解SpringMVC如何請(qǐng)求數(shù)據(jù)
    2022-07-07
  • Spring Boot實(shí)戰(zhàn)之逐行釋義Hello World程序

    Spring Boot實(shí)戰(zhàn)之逐行釋義Hello World程序

    spring boot 是基于Spring的一個(gè)框架,Spring boot幫我們集成很多常用的功能,使得整個(gè)配置更加簡(jiǎn)單。這篇文章主要介紹了Spring Boot實(shí)戰(zhàn)之逐行釋義Hello World,需要的朋友可以參考下
    2017-12-12

最新評(píng)論