Hibernate中load和get的區別
阿新 • • 發佈:2018-12-14
在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。