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