程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> Hibernate 中get()和load()與Hibernate簡介

Hibernate 中get()和load()與Hibernate簡介

編輯:關於JSP

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數據綁定

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved