日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate 延迟加载(一)

發(fā)布時(shí)間:2025/3/17 编程问答 9 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate 延迟加载(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1 延遲加載策略

  Hibernate 的延遲加載(lazy load)是一個(gè)被廣泛使用的技術(shù)。這種延遲加載保證了應(yīng)用只有在需要時(shí)才去數(shù)據(jù)庫中抓取相應(yīng)的記錄。通過延遲加載技術(shù)可以避免過多、過早地加載數(shù)據(jù)表里的數(shù)據(jù),從而降低應(yīng)用的內(nèi)存開銷。

Hibernate 的延遲加載本質(zhì)上就是代理模式的應(yīng)用,當(dāng)程序通過 Hibernate 裝載一個(gè)實(shí)體時(shí),默認(rèn)情況下,Hibernate 并不會(huì)立即抓取它的集合屬性、關(guān)聯(lián)實(shí)體所以對應(yīng)的記錄,而是通過生成一個(gè)代理來表示這些集合屬性、關(guān)聯(lián)實(shí)體,這就是代理模式應(yīng)用帶來的優(yōu)勢。

  但是,延遲加載也是項(xiàng)目開發(fā)中特別常見的一個(gè)錯(cuò)誤。如果對一個(gè)類或者集合配置了延遲檢索策略,那么必須當(dāng)代理類實(shí)例或代理集合處于持久化狀態(tài)(即處于Session范圍內(nèi))時(shí),才能初始化它。如果在游離狀態(tài)時(shí)才初始化它,就會(huì)產(chǎn)生延遲初始化錯(cuò)誤。所以,在開發(fā)獨(dú)立的DAO數(shù)據(jù)訪問層時(shí)應(yīng)該格外小心這個(gè)問題。

  如果在獲取對象的時(shí)候使用的是session.get()是不會(huì)延遲加載的,只有在使用load、hql時(shí)候才會(huì)延遲加載。

? ? ? Hibernate中允許使用延遲加載的地方主要有以下幾個(gè)地方:

<hibernate-mapping default-lazy=(true|false)”true”>:設(shè)置全局的延遲加載策略。

<class lazy=(true|false)>:DTD沒設(shè)置默認(rèn)值,推理默認(rèn)值為true

<property lazy=(true|false)>:設(shè)置字段延遲加載,默認(rèn)為false

<component lazy=(true|false):默認(rèn)為false

<subclass lazy=(true|false)>:默認(rèn)設(shè)置為true

<join-subclass lazy=(true|false)>:默認(rèn)設(shè)置為true

<union-subclass lazy=(true|false)>:默認(rèn)設(shè)置為true

<many-to-one lazy=(proxy|no-proxy|false)>:默認(rèn)為proxy

<one-to-one lazy=(proxy|no-proxy|false)>:默認(rèn)為proxy

<map lazy=(true|extra|false)>:默認(rèn)為true

<set lazy=(true|extra|false)>:默認(rèn)為true

<bag lazy=(true|extra|false)>:默認(rèn)為true

<ibag lazy=(true|extra|false)>:默認(rèn)為true

<list lazy=(true|extra|false)>:默認(rèn)為true


2 對象加載<class>

2.1 延遲加載策略(默認(rèn))

  如果想對實(shí)體對象使用延遲加載,必須要在實(shí)體的映射配置文件中進(jìn)行相應(yīng)的配置

  <class name="Person" table="PERSON" lazy="true">

1 ? ? tx = session.beginTransaction();

2 Person p=(Person) session.load(Person.class, "001");//(1)

3 ? ? System.out.println("0: "+p.getPersonId());//(2)

4 ? ? System.out.println("0: "+p.getName());//(3)

5 tx.commit();

6 ? ? session.close();

  執(zhí)行到(1)并沒有出現(xiàn)sql語句,并沒有從數(shù)據(jù)庫中抓取數(shù)據(jù)。這個(gè)時(shí)候查看內(nèi)存對象p如下:

圖2.1 person對象load時(shí)的內(nèi)存快照

  觀察person對象,我們可發(fā)現(xiàn)是Person$$EnhancerBy..的類型的對象。這里所返回的對象類型就是Person對象的代理對象,在hibernate中通過使用CGLB來先動(dòng)態(tài)構(gòu)造一個(gè)目標(biāo)對象的代理類對象,并且在代理對象中包含目標(biāo)對象的所有屬性和方法。所以,對于客戶端而言是否為代理類是無關(guān)緊要的,對他來說是透明的。這個(gè)對象中,僅僅設(shè)置了id屬性(即personId的值),這是為了便于后面根據(jù)這個(gè)Id從數(shù)據(jù)庫中來獲取數(shù)據(jù)。

? 運(yùn)行到(2)處,輸出為001,但是仍然沒有從數(shù)據(jù)庫里面讀取數(shù)據(jù)。這個(gè)時(shí)候代理類的作用就體現(xiàn)出來了,客戶端覺得person類已經(jīng)實(shí)現(xiàn)了(事實(shí)上并未創(chuàng)建)。但是,如果這個(gè)時(shí)候session關(guān)閉,再使用person對象就會(huì)出錯(cuò)了。

? 調(diào)試運(yùn)行到(3)處,要用到name屬性,但是這個(gè)值在數(shù)據(jù)庫中。所以hibernate從數(shù)據(jù)庫里面抓取了數(shù)據(jù),sql語句如下所示:

Hibernate: ? ? select ? ? ? ?person0_.PERSONID as PERSONID3_0_, ? ? ? ?person0_.NAME as NAME3_0_ ? ? from ? ? ? ?PERSON person0_ ? ? where ? ? ? ?person0_.PERSONID=?

  這時(shí)候,我們查看內(nèi)存里面的對象如下:

圖2.2 class延遲加載時(shí)內(nèi)存對象

  真正的Person對象放在CGLIB$CALLBACK_0對象中的target屬性里。

  這樣,通過一個(gè)中間代理對象,Hibernate實(shí)現(xiàn)了實(shí)體的延遲加載,只有當(dāng)用戶真正發(fā)起獲得實(shí)體對象屬性的動(dòng)作時(shí),才真正會(huì)發(fā)起數(shù)據(jù)庫查詢操作。所以實(shí)體的延遲加載是用通過中間代理類完成的,所以只有session.load()方法才會(huì)利用實(shí)體延遲加載,因?yàn)橹挥衧ession.load()方法才會(huì)返回實(shí)體類的代理類對象。

2.2 非延遲加載策略

  Hibernate默認(rèn)的策略便是非延遲加載的,所以設(shè)置lazy=false


1 ? ? tx = session.beginTransaction();2 ? ? Pe

2 Person p=(Person) session.load(Person.class, "001");//(1)

3 ? ? System.out.println("0: "+p.getPersonId());//(2)

4 ? ? System.out.println("0: "+p.getName());//(3)

5 tx.commit();6 ? ? session.close();

  調(diào)試運(yùn)行到(1)處時(shí),hibernate直接執(zhí)行如下sql語句:

Hibernate: ? ? select ? ? ? ?person0_.PERSONID as PERSONID3_0_, ? ? ? ?person0_.NAME as NAME3_0_ ? ? from ? ? ? ?PERSON person0_ ? ? where ? ? ? ?person0_.PERSONID=?

  我們在查看內(nèi)存快照如下:

? ? ?這個(gè)時(shí)候就不是一個(gè)代理類了,而是Person對象本身了。里面的屬性也已經(jīng)全部普通屬性也全部被加載。這里說普通屬性是因?yàn)閍ddresses這個(gè)集合對象并沒有被加載,因?yàn)閟et自己本身也可以設(shè)置lazy屬性。所以,這里也反映出class對象的lazy并不能控制關(guān)聯(lián)或集合的加載策略。(普通屬性會(huì)被加載,但是集合之類的就備受控制)

2.3 總結(jié)

  Hibernate中<class lazy=””>默認(rèn)為true。如果,在load的時(shí)候只會(huì)返回一個(gè)代理類,并不會(huì)正在從數(shù)據(jù)庫中讀取數(shù)據(jù)。第一次用到時(shí),會(huì)將所有普通屬性(set這種就不是)全部加載進(jìn)來。如果第一次使用到時(shí),session已經(jīng)關(guān)閉將發(fā)生錯(cuò)誤。

  如果顯式是設(shè)置lazy=false,load的時(shí)候即會(huì)把所有普通屬性全部讀取進(jìn)來。而且,返回的將是一個(gè)真正的該類型的對象(如Person),而不是代理類。

3 字段加載(property)

  在Hibernate3中,引入了一種新的特性——屬性的延遲加載,這個(gè)機(jī)制又為獲取高性能查詢提供了有力的工具。在大數(shù)據(jù)對象讀取時(shí),如Person對象中有一個(gè)School字段,該字段是一個(gè)java.sql.Clob類型,包含了用戶的簡歷信息,當(dāng)我們加載該對象時(shí),我們不得不每一次都要加載這個(gè)字段,而不論我們是否真的需要它,而且這種大數(shù)據(jù)對象的讀取本身會(huì)帶來很大的性能開銷。



轉(zhuǎn)載于:https://blog.51cto.com/longx/1354527

總結(jié)

以上是生活随笔為你收集整理的Hibernate 延迟加载(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一级作爱片 | 欧美a在线| 国产精品入口夜色视频大尺度 | 黄色动漫在线观看 | 麻豆一区二区在线观看 | 日韩在线观看av | 麻豆免费在线视频 | 欧美卡一卡二卡三 | 国产肉丝在线 | av片国产 | 日韩欧美国产一区二区 | 精品人妻无码中文字幕18禁 | 国产精品久久久久久福利 | 玖玖爱精品| avtt香蕉久久| 欧美大片高清 | 国产精品日韩欧美一区二区三区 | 成年人免费毛片 | 日韩伦理在线视频 | www.久久精品视频 | 国内自拍欧美 | 亚洲精品国偷拍自产在线观看蜜桃 | 日本东京热一区二区三区 | 中文在线字幕免费观 | 国产第6页| 欧美一区二区区 | 国产三区在线播放 | 撸大师av| 色人综合 | 丝袜老师办公室里做好紧好爽 | 一区二区三区在线免费观看视频 | 日日日日干 | 3d欧美精品动漫xxxx无尽 | 四虎在线视频 | 青青草伊人 | 国产在线三区 | 国产欧美日韩视频在线观看 | 六月婷婷七月丁香 | 涩涩涩在线观看 | 精品人妻少妇一区二区三区 | 在线欧美一区二区 | 热久久中文字幕 | 中文字幕一区二区在线老色批影视 | 热热色av | www.日日| 怡春院欧美| 欧美粗暴se喷水 | 日韩福利在线 | 91av精品 | 欧美一区二区日韩 | 神马午夜一区二区 | 欧美黄色大片网站 | 一区二区三区波多野结衣 | 亚欧洲乱码视频 | 黄色高潮视频 | 午夜影院在线观看 | 日韩人妻一区二区三区 | 久久久性色精品国产免费观看 | 天堂国产在线 | 欧美日韩一区二区三区在线 | 日韩黄色在线观看 | 成人av在线资源 | 国产一国产二 | 五月激情丁香 | 秋霞福利片 | 欧美在线视频a | 精品视频一区二区三区四区五区 | 欧美亚洲韩国 | 中文在线字幕 | 射在线 | 99国产热| jizz日本18 | 日韩中文欧美 | 一级α片免费看刺激高潮视频 | 欧美做爰全过程免费看 | 99亚洲视频| 日韩精品第1页 | 激情婷婷在线 | 欧洲国产精品 | 国产精品久久国产 | 91久久精品一区二区别 | 中文字幕在线观看网 | 黄色福利站| 校园激情亚洲 | 婷婷色伊人 | 依依成人综合网 | 午夜福利啪啪片 | 日韩亚洲欧美精品 | 国产精品久久久久久久天堂 | 狠狠爱成人 | 国产中文字幕乱人伦在线观看 | 动漫美女被到爽流 | 久久精品国产亚洲av嫖农村妇女 | 奇米视频在线 | 小向美奈子在线观看 | 无码人妻aⅴ一区二区三区 国产高清一区二区三区四区 | 国产视频导航 | a在线看 | 在线亚洲网站 |