hibernate 中get()和load()與hibernate簡介
session先判斷對象是否存在,如果存在就不到數據庫教程中檢索。返回的對象都位於session緩存中,接下來修改了持久化對象的屬性後,當session清理緩存時,會根據持久化對象的屬性變化來同步更新數據庫。
區別:
(1)當數據庫中不存在與oid對應的記錄時,load()方法拋出objectnotfoundexception異常,而get()方法返回null.
(2)兩者采用不同的檢索策略。
默認情況下,load()方法采用延遲檢索策略(hibernate不會執行select語句,僅返回實體類的代理類實例,占用內存很少);而get()采用立即檢索策略(hibernate會立即執行select語句)。
使用場合:
(1)如果加載一個對象的目的是為了訪問它的各個屬性,可以用get();
(2)如果加載一個對象的目的是為了刪除它,或者建立與別的對象的關聯關系,可以用load() ;
hibernate數據加載get/load的區別
session.load/get方法均可以根據指定的實體類和id從數據庫讀取記錄,並返回與之對應的實體對象。其區別在於:
如果未能發現符合條件的記錄,get方法返回null,而load方法會拋出一個objectnotfoundexception。
load方法可返回實體的代理類實例,而get方法永遠直接返回實體類。
load方法可以充分利用內部緩存和二級緩存中的現有數據,而get方法則僅僅在內部緩存中進行數據查找,如沒有發現對應數據,將越過二級緩存,直接調用sql完成數據讀取。
session在加載實體對象時,將經過的過程:
首先,hibernate中維持了兩級緩存。第一級緩存由session實例維護,其中保持了session當前所有關聯實體的數據,也稱為內部緩存。而第二級緩存則存在於sessionfactory層次,由當前所有由本sessionfactory構造的session實例共享。出於性能考慮,避免無謂的數據庫訪問,session在調用數據庫查詢功能之前,會先在緩存中進行查詢。首先在第一級緩存中,通過實體類型和id進行查找,如果第一級緩存查找命中,且數據狀態合法,則直接返回。
之後,session會在當前“nonexists”記錄中進行查找,如果“nonexists”記錄中存在同樣的查詢條件,則返回null。“nonexists”記錄了當前session實例在之前所有查詢操作中,未能查詢到有效數據的查詢條件(相當於一個查詢黑名單列表)。如此一來,如果session中一個無效的查詢條件重復出現,即可迅速作出判斷,從而獲得最佳的性能表現。
對於load方法而言,如果內部緩存中未發現有效數據,則查詢第二級緩存,如果第二級緩存命中,則返回。
如在緩存中未發現有效數據,則發起數據庫查詢操作(select sql),如經過查詢未發現對應記錄,則將此次查詢的信息在“nonexists”中加以記錄,並返回null。
根據映射配置和select sql得到的resultset,創建對應的數據對象。
將其數據對象納入當前session實體管理容器(一級緩存)。
執行interceptor.onload方法(如果有對應的interceptor)。
將數據對象納入二級緩存。
如果數據對象實現了lifecycle接口,則調用數據對象的onload方法。
返回數據對象
hibernate源碼中幾個包的作用簡要介紹
net.sf.hibernate.*
該包的類基本上都是接口類和異常類
net.sf.hibernate.cache.*
jcs的實現類
net.sf.hibernate.cfg.*
配置文件讀取類
net.sf.hibernate.collection.*
hibernate集合接口實現類,例如list,set,bag等等,hibernate之所以要自行編寫集合接口實現類是為了支持lazy loading
net.sf.hibernate.connection.*
幾個數據庫連接池的provider
net.sf.hibernate.dialect.*
支持多種數據庫特性,每個dialect實現類代表一種數據庫,描述了該數據庫支持的數據類型和其它特點,例如是否有autoincrement,是否有sequence,是否有分頁sql等等
net.sf.hibernate.eg.*
hibernate文檔中用到的例子
net.sf.hibernate.engine.*
這個包的類作用比較散
net.sf.hibernate.expression.*
hql支持的表達式
net.sf.hibernate.hq.*
hql實現
net.sf.hibernate.id.*
id生成器
net.sf.hibernate.impl.*
最核心的包,一些重要接口的實現類,如果session,sessionfactory,query等
net.sf.hibernate.jca.*
jca支持,把session包裝為支持jca的接口實現類
net.sf.hibernate.jmx.*
我不懂jmx,只知道jmx是用來編寫app server的管理程序的,大概是jmx部分接口的實現,使得app server可以通過jmx接口管理hibernate
net.sf.hibernate.loader.*
也是很核心的包,主要是生成sql語句的
net.sf.hibernate.lob.*
blob和clob支持
net.sf.hibernate.mapping.*
hbm文件的屬性實現
net.sf.hibernate.metadata.*
po的meta實現
net.sf.hibernate.odmg.*
odmg是一個orm標准,這個包是odmg標准的實現類
net.sf.hibernate.persister.*
核心包,實現持久對象和表之間的映射
net.sf.hibernate.proxy.*
proxy和lazy loading支持
net.sf.hibernate.ps教程.*
該包是preparedstatment cache
net.sf.hibernate.sql.*
生成jdbc sql語句的包
net.sf.hibernate.test.*
測試類,你可以用junit來測試hibernate
net.sf.hibernate.tool.hbm2ddl.*
用hbm配置文件生成ddl
net.sf.hibernate.transaction.*
hibernate transaction實現類
net.sf.hibernate.type.*
hibernate中定義的持久對象的屬性的數據類型
net.sf.hibernate.util.*
一些工具類,作用比較散
net.sf.hibernate.xml.*
xml數據綁定