1. 程式人生 > >Hibernate中load和get的區別

Hibernate中load和get的區別

在Hibernate中,查詢一個物件的方法有兩種:load和get。兩者在延遲載入方面有所不同。

1、load查詢方式

通過load方法查詢物件的時候,Hibernate會使用延遲載入的方式來查詢指定的物件,也就是說,通過load方法獲取一個物件的時候,並沒有真的發出SQL語句到資料庫取查詢資料,只是生成了一個空的物件返回回來。

當程式真的使用到這個物件的時候,才會發出SQL語句到資料庫裡去查詢資料。

例如,如下程式碼:

User user = (User) session.load(User.class, 1); // 這行程式碼執行完,並沒有發出SQL語句
System.out.println(user); // 傳送SQL語句,到資料庫查詢資料

實際上,上述第一行程式碼,只是返回了一個代理物件。只有真正使用到了這個物件的時候,才會到資料庫查詢其相應的資料欄位,就像上述第二行程式碼那樣。

2、get查詢方式

使用get方法查詢物件,就不會使用延遲載入的機制了,它會直接傳送SQL到資料庫,然後把查詢到的資料欄位注入到物件中去,然後返回出來。

例如,如下程式碼:

User user = (User) session.get(User.class, 1); // 直接傳送SQL到資料庫,查詢資料欄位

3、注意事項

通過get獲取物件的時候,當我們試著用一個存在的ID去查詢資料時,會丟擲NullPointerException。而使用load方式獲取物件時,如果資料不存在,則會丟擲ObjectNotFoundException。

我們知道,如果使用的是load方式查詢資料,返回的是一個代理物件,只有在使用這個代理物件的時候,才會傳送SQL去資料庫載入資料。所以,如果在你使用這個代理物件之前你關閉了session,則會丟擲LazyInitializationException。