1. 程式人生 > >Hibernate的載入方式——GET與LOAD的對比

Hibernate的載入方式——GET與LOAD的對比

      在Hibernate框架中,最常用到的載入方式就非Get和Load莫屬了,然而Get和Load在載入方式上邊還有很多的不同,下面讓我們來分析一下他們的不同之處。

區別

       從返回的結果上來看,get、load在檢索到資料的時候,會返回物件(代理物件或實體物件),但他們的檢索方式不同,這個後續在細說。get檢索不到資料的時候,會返回null;而load檢索不到資料會返回org.hibernate.ObjectNotFoundException。下面通過兩個例子來分析一下get與load的工作原理。

工作原理

Get載入(資料庫中存在檢索的資料),這裡只分析測試類,實體類就不再討論了。

/**
 * 查詢資料庫中有資料的欄位
 */
public void testGetNotNull() {
	Session session = null;
	try {
		session = HibernateUtils.getSession();
		session.beginTransaction();
		// 資料庫中存在id為2的資料
		User user = (User)session.get(User.class, 2);
		System.out.println("---------Get載入--------");
		System.out.println(user);
		System.out.println(user.getId() + "---->>" + user.getName());
		System.out.println("------------------------");
		session.getTransaction().commit();
	} catch (Exception e) {
		e.printStackTrace();
		session.getTransaction().rollback();
	} finally {
		HibernateUtils.closeSession(session);
	}
}
       因為Hibernate規定get方法不能使用延遲載入,當執行到User user = (User)session.get(User.class, 2);這條語句時,get方法首先會查詢session快取,沒有的話就查詢二級快取,最後會查詢資料庫,因此在執行該語句的時候,會先發出sql語句進行查詢。而且,執行get方法的時候,get方法每次都會從資料庫直接查詢。由於這是資料庫中存在id為2的資料,因此,user會返回實體物件。如下圖:


Get載入(資料庫中不存在檢索的資料)

/**
 * 查詢資料庫中不存在的資料
 */
public void testGetWithNull() {
	Session session = null;
	try {
		session = HibernateUtils.getSession();
		session.beginTransaction();
		// 資料庫中不存在id為0的資料
		User user = (User)session.get(User.class, 0);
System.out.println("---------Get載入--------"); System.out.println(user); //System.out.println(user.getId() + "---->>" + user.getName()); System.out.println("------------------------"); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtils.closeSession(session); } }
      同上,在執行到User user = (User)session.get(User.class, 0);這條語句時,get方法每次都是直接查詢資料庫,在執行該語句時,Hibernate會發出sql語句,到資料庫進行查詢資料,由於id為0的資料不存在,get方法查詢不到資料時,會返回null。因此,user的結果自然也是null了。如下圖:


Load載入(資料庫中存在檢索的資料)

/**
 * 資料庫中存在查詢的資料
 */
public void testLoadNotNull() {
	Session session = null;
	try {
		session = HibernateUtils.getSession();
		session.beginTransaction();
		// 資料庫中存在id為2的資料
		User user = (User)session.load(User.class, 2);
		System.out.println("----------Load載入-----------");
		System.out.println(user);
		System.out.println(user.getId() + "---->>" + user.getName());
		System.out.println("-----------------------------");
		session.getTransaction().commit();
	} catch (Exception e) {
		e.printStackTrace();
		session.getTransaction().rollback();
	} finally {
		HibernateUtils.closeSession(session);
	}
}
    Hibernate中,load方法是支援延遲載入的,在執行到User user = (User)session.load(User.class, 2);這條語句時,load方法首先會查詢session的persistent Context中是否存在快取,如果存在則直接返回;如果沒有快取,則load方法會判斷是否是lazy載入,如果不是lazy方式,則直接訪問資料庫,查詢Id為2的資料,由於資料庫中存在Id為2的資料,因此get方法會返回實體物件。  如果load方法判斷的是lazy方式載入,那麼就需要建立代理物件,物件的initialized屬性為false,target屬性為null,在訪問獲得的代理物件的屬性時,會訪問資料庫,找到記錄後就會把該記錄的物件複製到代理物件的target上,並將initialized屬性設為true。在這個例子中,load方法採用的是lazy方式,因此在執行load方法時,Hibernate不會發出sql語句,因為此時Hibernate建立了代理物件,但並沒有訪問代理物件的屬性。當執行System.out.println(user);時,Hibernate才會初次發出sql語句,去查詢資料庫。如下圖:


Load載入(資料庫中不存在檢索的資料)

/**
 * 資料庫中不存在查詢的資料
 */
public void testLoadWithNull() {
	Session session = null;
	try {
		session = HibernateUtils.getSession();
		session.beginTransaction();
		// 資料庫中不存在id為0的資料
		User user = (User)session.load(User.class, 0);
		System.out.println("----------Load載入-----------");
		System.out.println(user);
		//System.out.println(user.getId() + "---->>" + user.getName());
		System.out.println("-----------------------------");
		session.getTransaction().commit();
	} catch (Exception e) {
		e.printStackTrace();
		session.getTransaction().rollback();
	} finally {
		HibernateUtils.closeSession(session);
	}
}
    同上,在執行到load方法時,load方法會首先查詢session中是否存在快取,如果存在則直接返回,如果不存在則會判斷是否為lazy,這裡設定的是lazy方式,因此load方法會認為資料庫中存在資料,直接建立代理物件,把代理物件返回給user。     而執行到System.out.println(user);時,Hibernate會發出sql語句,訪問資料庫查詢Id為0的資料,由於資料庫中不存在Id為0的資料,因此load方法會返回org.hibernate.ObjectNotFoundException,直接丟擲異常。如下圖:

結束語

     Hibernate中,對於get和load方法的根本區別,就在於Hibernate對於load方法認為資料庫中一定存在要檢索的資料,可以放心的使用代理來延遲載入,如果在使用過程中發現了問題,那麼只能丟擲異常;而對於get方法,Hibernate一定要獲取到真實的資料才會返回物件,否則返回null。 參考資料: 後勤倉庫的Hibernate get和load區別

相關推薦

Hibernate載入方式——GETLOAD對比

      在Hibernate框架中,最常用到的載入方式就非Get和Load莫屬了,然而Get和Load在載入方式上邊還有很多的不同,下面讓我們來分析一下他們的不同之處。 區別        從返回的結果上來看,get、load在檢索到資料的時候,會返回物件(代理物件或

Hibernate深入之get()load()懶載入

get和load, 一個是直接載入,並不是直接去資料庫查詢,如果快取裡有,首先到快取裡找,快取分為一級快取和二級快取,首先到一級快取中查詢; 如果在session關閉之後進行獲取類的名字之類的屬性,依然會獲取到,例: Order od = (Order) session.g

hibernate 中的getload的區別

Hibernate get和load區別 get和load方式是根據id取得一個記錄 下邊詳細說一下get和load的不同,因為有些時候為了對比也會把find加進來。 1.從返回結果上對比: load方式檢索不到的話會丟擲org.hibernate.Ob

hibernate載入物件(getload的區別)

在hibernate中我們知道如果要從資料庫中得到一個物件,通常有兩種方式: 通過session.get()方法和通過session.load()方法,然後其實這兩種方法在獲得一個實體物件時是有區別的

hibernate載入持久化對象的兩種方式——getload

總結 font 存在 con null 同學 分析 保存 找到 一.get與load對照 在hibernate中get和load方法是依據id取得持久化對象的兩種方法。但在實際使用的過程中總會把兩者混淆,不知道什麽情況下使用get好,什麽時候使用lo

hibernate載入持久化物件的兩種方式——getload

一.get與load對比      在hibernate中get和load方法是根據id取得持久化物件的兩種方法,但在實際使用的過程中總會把兩者混淆,不知道什麼情況下使用get好,什麼時候使用load方法效率更高。下邊詳細說一下get和load的不同,有些時候為了對比也會

hibernate架構之session中getload方法的區別

r.java one 升級版 數據庫 apache appenders 進行 方法 main hibernate是一個用於連接數據庫的升級版JDBC,與一般JDBC不同的是,hibernate架構是通過hql進行查找,通過session建立連接。其工作原理是:將實例分為瞬時

Hibernate單表操作(六)——查詢記錄get()load()方法區別

在上一次的案例中,通過get或者load方法得到的結果一樣。 既然得到的結果一樣, 那麼  get和load方法查詢記錄的區別是什麼呢? 區別一: 在不考慮快取的情況下,get方法會在呼叫之後立即向

hibernate延遲載入機制——getload原理

在hibernate中我們知道如果要從資料庫中得到一個物件,通常有兩種方式,一種是通過session.get()方法,另一種就是通過session.load()方法,然後其實這兩種方法在獲得一個實體物件時是有區別的,在查詢效能上兩者是不同的。 一.load載入方式 當

Hibernate中session getload的區別,物件生命週期

Hibernate中會話get和load的區別 get()方法會立即查詢(快取中有則不查詢),load()懶載入,直到你需要用到資料的時候才去查資料庫 找不到物件時get()是返回NULL,load()會拋異常; 因此使用load()方法時,要確認查詢的主鍵ID是一定存在的。 loa

通俗易懂的請求方式getpost兩者的區別

     相信對於計算機有點了解的都聽過get與post這兩種的請求方式,但是對於這兩種請求方式的具體區別有可能不太清楚,相信大家在網上關於這兩種的區別應該一搜索一大把,我也看了下網上其他部落格或者簡書對於這兩種的區別的解釋。有好多的說post是用於提交資料用的,而get是

Hibernate查詢之getload的區別

一、.從返回結果上對比 load方式檢索不到的話會丟擲org.hibernate.ObjectNotFoundException異常 get方法檢索不到的話會返回null 二、.從檢索執行機制上對比 get方法和find方法都是直接從資料庫中檢索 ,而

mybatis 對映檔案載入方式(resourceclass,package)

1.resource載入方式,適用於類路徑下的檔案載入(注意:mybatis原始開發Dao,xml檔案與介面檔案不在同一路徑下,僅能用resource載入對映檔案)     <mappers>         //注意路徑書寫方式         <ma

Hibernate筆記6(getload)

session.load()和session.get() loadObject load(Class theClass,            Serializable id)            throws HibernateExceptionReturn the pe

hibernate延遲載入(getload的區別)

在hibernate中我們知道如果要從資料庫中得到一個物件,通常有兩種方式,一種是通過session.get()方法,另一種就是通過session.load()方法,然後其實這兩種方法在獲得一個實體物件時是有區別的,在查詢效能上兩者是不同的。 一.load載入方式 當使用

Hibernate中的即時載入get)和延時載入load

一,即時載入     Student student = session.get(Student.class, 22);     System.out.println(student);       &nb

getload載入小總結

一、get()與load() 1、 是否支援懶載入 Load支援懶載入,get不支援懶載入 2、 載入時機不同 Load採用延遲載入,等到使用非主鍵時才去讀庫 Get馬上讀庫 3、 搜素不到資料時的情況 當搜素的資料不存在時,load會返回一個物件,在使用該物件的非主鍵屬性

Hibernateget()和load()的區別

factory all htm on() 被調用 容易 transacti rip con Hibernate中根據Id單條查詢獲取對象的方式有兩種,分別是get()和load(),來看一下這兩種方式的區別。 1. get() 使用get()來根據ID進行單條查詢:

Hibernate中Session之getload方法的真正區別

repl .get user href 獲得 tno lose 錯誤 ftw 最近在學習SHH框架中的hibernate,對Session的get和load方法,有點混不清楚,不知道區別在哪,或者對它們的區別感觸不深。所以百度了一下,結果問題來了。百度的結果和實際測試

HibernateMybatis對比

hibernate mybatis Hibernate與Mybatis對比前言 今天同事跟我說現在的公司很少用hibernate,大部門都用mybatis。平時也經常接觸這兩方面,正好最近不怎麽忙,查看網上其他相關技術文檔 ,梳理下Mybatis和Hibernate對比,加深我們對持久化