Hibernate的Session的get()和load()方法區別

忘塵天外天發表於2017-10-31

hibernate中Session介面提供的get()和load()方法都是用來獲取一個實體物件,在使用方式和查詢效能上有一些區別。

get

Session介面提供了4個過載的get方法,分別通過“持久類+主鍵”和“全類名+主鍵”以及“鎖選項”來獲取實體物件。

public Object get(Class clazz, Serializable id);
public Object get(Class clazz, Serializable id, LockOptions lockOptions);

public Object get(String entityName, Serializable id);
public Object get(String entityName, Serializable id, LockOptions lockOptions);

load

load跟get呼叫方式基本一樣,多了一個過載方法:使用“一個空的持久化類的例項+主鍵”來獲取實體物件。

public void load(Object object, Serializable id);

get和load的區別

分別註釋掉列印語句,即只是獲取了物件,沒有使用該物件。可以看到get方法發出了sql語句,而load方法沒有發出sql語句。

get方法會在呼叫之後立即向資料庫發出sql語句(不考慮快取的情況下),返回持久化物件;而load方法會在呼叫後返回一個代理物件,該代理物件只儲存了實體物件的id,直到使用物件的非主鍵屬性時才會發出sql語句。

查詢資料庫中不存在的資料時,get方法返回null,load方法丟擲異常org.hibernate.ObjectNotFoundException

關於延遲載入和快取

  hibernate3以後預設啟用延遲載入:lazy="true",get方法不使用延遲載入機制,首先查詢Session快取,然後查詢二級快取,然後查詢資料庫。load方法首先查詢Session快取,然後查詢二級快取,若找不到則返回代理物件,延遲到真正使用物件非逐漸屬性時才發出sql語句載入物件。若設定lazy="false",load返回代理物件之後會發出sql語句,若找不到符合條件的記錄,依然會丟擲ObjectNotFoundException異常。

 

相關文章