国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Hibernate延遲加載原理與實現(xiàn)方法

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

2020-04-13 11:22張國亮 JAVA教程

這篇文章主要介紹了Hibernate延遲加載原理與實現(xiàn)方法,較為詳細的分析了Hibernate延遲加載的概念,原理與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下

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

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

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

1. 延遲加載(load)

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

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

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

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

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

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

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

能夠懶加載的對象都是被改寫過的代理對象,當相關(guān)聯(lián)的session沒有關(guān)閉時,訪問這些懶加載對象(代理對象)的屬性(getId和getClass除外)hibernate會初始化這些代理,或用Hibernate.initialize(proxy)來初始化代理對象;當相關(guān)聯(lián)的session關(guān)閉后,再訪問懶加載的對象將出現(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)連接來獲得對象的數(shù)據(jù)和它關(guān)聯(lián)對象的數(shù)據(jù),此時關(guān)聯(lián)對象的延遲加載失效。

集合屬性上的抓取策略:

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

4. 延遲加載案例分析

情況一:單個實體調(diào)用load()方法取消懶加載

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.hbsi.test;
import org.hibernate.Session;
import org.junit.Test;
import com.hbsi.domain.User;
import com.hbsi.utils.HibernateUtil;
publicclass TestLazy {
//測試get()方法;get()方法不管你有沒有用到,總會執(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對象;這是因為雖然處于托管狀態(tài),但是這個對象是存在屬性值的對象,并沒有把他刪除,只是隔絕了它與數(shù)據(jù)庫的打交道的通道。
System.out.println(user.getName());
}
//測試load()方法;不執(zhí)行sql語句,用到的時候才執(zhí)行
@Test
publicvoid testLoad(){
Session session = HibernateUtil.getSession();
User user = (User) session.load(User.class,1);
//這里輸出id也不會執(zhí)行sql語句,直接從上面你傳進去的id中獲取id,沒有從數(shù)據(jù)庫中查找,所以也不執(zhí)行sql語句
System.out.println(user.getId());
//而輸出name就不一樣了,這時其實就是實例化了代理對象,這是的代理對象有了name的屬性,這時即使你關(guān)閉了session,也可以通過這個對象獲取到name;如果注釋這句,即不實例化代理對象,又在關(guān)閉session后執(zhí)行輸出name屬性,這時會報錯:could not initialize proxy
// System.out.println(user.getName());
HibernateUtil.close();
System.out.println(user.getName());
}
}

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

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

?
1
2
3
4
5
6
7
8
9
10
11
@Test
publicvoid find(){
Session session = HibernateUtil.getSession();
Customer cus = (Customer) session.get(Customer.class,3);
System.out.println(cus.getCname());
//用到下面這種方法輸出會出現(xiàn)兩天sql語句,而且是分開的;如果用到懶加載會出現(xiàn)先輸出兩條sql語句,在輸出結(jié)果
//這里不能直接方法鏈式輸出cus.getOrd().getOname();因為cus.getOrd()返回的是一個set集合
Set<Orders> orders = cus.getOrd();
System.err.println(orders.size());
HibernateUtil.close();
}

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

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

希望本文所述對大家基于Hibernate框架的Java程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品久久久久久久久久久下田 | 中文字幕一区二区三区在线视频 | 欧美一区二区三区男人的天堂 | 福利国产| 久久99精品国产99久久6尤 | 亚洲国产成人av | 欧美激情国产日韩精品一区18 | 婷婷精品视频 | 激情视频网站 | 一区久久 | 欧美日韩国产高清 | 国产美女在线播放 | 99re免费视频精品全部 | 老熟妇午夜毛片一区二区三区 | 国产精品视频久久 | 欧美伊人 | 视频在线一区 | 中文字幕三区 | 中国黄色片在线观看 | 国产成人精品一区二 | 亚洲福利在线观看 | 国产人久久人人人人爽 | 欧美黄色一区 | 国产在线综合网 | 亚洲精品视频一区二区三区 | 欧美区在线 | www久久久久| 亚洲人成网站在e线播放 | 一级片在线免费观看视频 | 国产欧美日韩二区 | 精品国产乱码久久久久久88av | 成人毛片在线观看视频 | 国产三级久久久久 | 做视频免费观看网站 | 欧美一区二区最爽乱淫视频免费看 | 国产九九九 | 精品久久久久一区二区国产 | 成人av片在线观看 | 永久黄网站色视频免费 | 亚洲一区二区中文字幕 | 日本不卡高字幕在线2019 |