懶載入 延遲載入

2021-09-30 09:11:32 字數 1776 閱讀 2651

概念:為了推遲和資料庫互動的時間,推遲到真正需要這個物件資料的時候。提高系統的效能

通過 asm和cglib二個jar包實現懶載入。domain是非final的

1、session.load懶載入

(1)返回的是乙個**物件,new關鍵字來建立乙個**物件,理解成乙個快捷方式,不是真正的類,而是**類。

(2)**物件繼承了原物件,所以用強制造型可以使用。

(3)**物件限制:和**關聯的session關閉之前使用

(4)利用hibernate中的靜態方法  hibernate.initialize(物件);它會讓hibernate訪問資料庫getid()  getclass() 方法不會訪問資料庫,他們的值在不妨問資料庫下也能得到

(5)在對映檔案class中的屬性 lazy="false" 表示懶載入被關閉掉了,可以直接查詢,跟get()一樣

2、one-to-one(元素)懶載入:一對一的關聯關係

(1)當我們查詢的是主物件時,將兩個表外連線查詢出主物件和從物件,沒有相應的懶載入

(2)當我們查詢的是從物件時,從物件所關聯的主物件,會賦**物件,使用懶載入

(3)通過hibernate.initialize(從物件.get主物件())初始化,強迫hibernate訪問資料庫。

(4)滿足三個條件才能實現懶載入:

1)lazy!=false

lazy有三個屬性值: proxy使用** no-proxy不使用** false 不使用懶載入,立即查詢。

2)constrained=true

從表中要有乙個這樣的屬性,表示建立外來鍵約束

3)fetch=select(從物件中one-to-one中設定)

lazy 指相關聯的屬性什麼時候抓取

fetch 抓取的策略,以什麼方式來抓取

select表示二次select語句查詢

join 表示連線查詢。如果加上,則懶載入不起作用,直接將兩表連線查詢。

3、one-to-many(元素)懶載入

1)lazy!=false

2)fetch=select

當fetch屬性為join時候,懶載入失效,直接將兩表連線並查詢出結果。

4.many-to-one (元素):

1)lazy!=false

2)fetch=select

當fetch屬性為join時候,懶載入失效,直接將兩表連線並查詢出結果。

5.many-to-many (元素):

1)lazy!=false

屬性值為  true false  是否懶載入

2)fetch=select

當fetch屬性為join時候,懶載入失效,直接將兩表連線並查詢出結果。

6.注意:

能夠懶載入的物件都是被改寫過的**物件,當相關聯的session沒有關閉時,訪問這些懶載入物件(**物件)的屬性(getid和getclass除外)hibernate會初始化這些**,或用hibernate.initialize(proxy)來初始化**物件;當相關聯的session關閉後,再訪問懶載入的物件將出現異常。

總結:在關聯對映中使用懶載入來設定lazy和fetch屬性,注意,要查詢的哪一方的資料,就在相對應的對映檔案中設定,一般在關聯屬性標籤內加入屬性

一般不用改變lazy屬性和fetch屬性,尤其在多對多,一對多等關係對映中

懶載入對系統的效能有很大的作用。

Mybatis延遲載入(懶載入)

將採用高階對映實現多表聯查時向資料庫發出的sql語句拆分成若干條單錶查詢的sql語句,當需要返回資料時才會向資料庫發出只針對當前資料的sql語句。需求 根據訂單編號,查詢訂單,並返回訂單詳情描述資訊實現延遲載入的前提條件 在settings中配置與延遲載入有關的屬性.column 查詢user的引數...

EF延遲載入 懶載入

關於ef懶載入英文翻譯lazyload也俗稱延遲載入 只有是 導航屬性 並且 類是public 字段必須用virtual 才能用延遲載入,ef預設是延遲載入的,什麼是延遲載入呢?延遲載入就是當需要用到集合的時候才會去資料庫取資料,有點是什麼呢?優點就是按需取資料提高了載入的速度,缺點是需要多次執行s...

Swift中的延遲載入 懶載入

而在swift中,你只需一行 即可實現此機制 lazy var players string 簡單 簡潔,直入主題。但你得記住,你必須使用var關鍵字來定義延遲載入的屬性,不能使用let關鍵字,因為常量必須在例項構建時賦值。lazy var players string 如果你願意,你也可以使用例項...