1. 程式人生 > >hibernate中session.get( , )和session.load( , )的使用及區別

hibernate中session.get( , )和session.load( , )的使用及區別

get(Class clazz,id)和load(Class clazz,id)都是用來根據主鍵的內容查詢資料庫中資料,並且返回相對應的類的物件

用法如下:

public static void main(String[] args) {
		//讀取總的配置檔案
		Configuration configuration = new Configuration().configure();
		//建立sessionFactory
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		//得到session
		Session session = sessionFactory.openSession();
		//開啟事務
		Transaction transaction = session.beginTransaction();
                //查詢出User類所對應的表中的主鍵值為1的整行資料,並且將其所有欄位的值一    一對應的賦值給User類中的屬性
		User user = (User) session.load(User.class, 1);
                //提交事務
		transaction.commit();
                //關閉session
		session.close();
	}

load()方法查詢過程:

load()先到session快取(即一級快取)中去查,然後再去二級快取中去查,如果都沒有則返回一個代理物件(可以把它理解成一個假“”的物件,一個替身。等後面使用這個代理物件進行操作時,才去資料庫中查,這就是懶載入的過程。這個物件可以自動轉化成實體物件,但當代理物件被呼叫的時候如果資料庫中此資料不存在,就會丟擲ObjectNotFoundException

get()方法查詢過程:     先到session快取(即一級快取)中去查,如果查不到再去二級快取中去查,如果都沒有找到就馬上向資料庫傳送查詢的請求(sql語句)

get 和 load 的區別:     1) 如果查詢不到相對應的資料,get 返回的是一個空物件,即 null。load 則報ObjectNotFoundException     2) 使用get去查詢資料會立即向資料庫傳送查詢請求(即查詢的sql語句)。如果使用load 方法,則屬於懶載入。它才先後去一級快取和二級快取中去查詢,如果這裡面都沒有,則返回一個代理物件,如果下面的程式碼中沒有用到所查詢出來的類物件,那麼它就不向資料庫傳送查詢請求。直到程式設計師在下面的程式碼中使用了查詢結果的時候,就真正的向資料庫傳送出查詢的sql語句

    3)懶載入就是一種優化,就相當於 : 如果查詢的結果你都不用,那我為什麼要幫你去查?

如何在使用load方法的時候,不使用懶載入?

在物件關係對映檔案中(即.hbm.xml檔案)的<class name="" table="">標籤中加入一個屬性:lazy="false" 即:

<class name="" lazy="false" table=""> <!--lazy這個屬性預設的是true-->

何時使用get? 何時使用load??

如果確定資料庫中有所要查詢的資料,那麼就用load,因為這樣子的話即不會報ObjectNotFoundException,效率還高。不確定的話就用get