關於Hibernate的session的load方法

2023-01-26 03:20:41 字數 5229 閱讀 2907

1樓:帳號已登出

呼叫session.load()方法時候,首先到session中找,找不到直接建立**。除非真正用到資料的時候

load方法才會進行資料庫的呼叫,那麼這個時候,如果資料庫沒有對應的id那麼方法就會跑出異常。

如果說記憶體中已經存在所有的 物件,那麼不管是load放啊還是get方法,它們都會返回記憶體中的形態 。

2樓:匿名使用者

**物件就是 查詢部分資料 等需要詳細的資料的時候在查詢 舉個例子 比如select * from 表

**物件就是隻查出對應的id 然後你需要某一個屬性的時候再查 select id from 表 然後你需要取di=5的時候在傳送 select * from 表id=5.你把sql語句開啟啊 這樣每次用hibenate的時候都知道是怎麼回事

3樓:匿名使用者

users user = (users)session.load(users.class, userid);

這裡你傳入了userid,既然沒有發出sql,我覺得應該從這裡獲得的。

4樓:

從資料庫中查詢而來的

hibernate中session的load()和get()方法如何使用,舉列子說明

5樓:匿名使用者

1、定義一個實體類

2、根據主鍵獲取資料記錄

示例:users user = (users)session.load(users.class, userid);   //users是實體類,userid是主鍵值

users user = (users)session.get(users.class, userid);

6樓:

load()是首先訪問快取,如果沒有則訪問資料庫,get()是直接訪問資料庫!

hibernate的session的persist方法和load方法是起什麼作用的?

hibernate中get方法和load方法的區別

7樓:吉祥二進位制

簡單總結: 一句話,hibernate對於load方法認為該資料在資料庫中一定存在。

可以放心的使用**來延遲載入,如果在使用過程中發現了問題,只能拋異常;而對於get方法,hibernate一定要獲取到真實的資料,否則返回null。

hibernate中session的load和get方法的區別

8樓:地瓜說機

(1)get()方法直接返回實體類,如果查不到資料則返回null。load()會返回一個實體**物件(當前這個物件可以自動轉化為實體物件),但當**物件被呼叫時,如果沒有資料不存在,就會丟擲個org.hibernate.

objectnotfoundexception異常

(2)load先到快取(session快取/二級快取)中去查,如果沒有則返回一個**物件(不馬上到db中去找),等後面使用這個**物件操作的時候,才到db中查詢,這就是我們常說的 load在預設情況下支援延遲載入(lazy)

(3) get先到快取(session快取/二級快取)中去查,如果沒有就到db中去查(即馬上發出sql)。總之,如果你確定db中有這個物件就用load(),不確定就用get()(這樣效率高)

(4)get和load查詢資料庫

1. 如果查詢不到資料,get 會返回 null,但是不會報錯, load 如果查詢不到資料,則報錯objectnotfoundexception

2. 使用get 去查詢資料,(先到一級/二級)會立即向db發出查詢請求(select ...), 如果你使用的是 load查詢資料,(先到一級、二級))即使查詢到物件,返回的是一個**物件,如果後面沒有使用查詢結果,它不會真的向資料庫發select ,當程式設計師使用查詢結果的時候才真的發出select ,這個現象我們稱為懶載入(lazy)

hibernate中get方法和load方法的區別

9樓:匿名使用者

如果你使用load方法,hibernate認為該id對應的物件(資料庫記錄)在資料

庫中是一定存在的,所以它可以放心的使用,它可以放心的使用**來延遲載入該物件。在用到物件中的其他屬性資料時才查詢資料庫,但是萬一資料庫中不存在該

記錄,那沒辦法,只能拋異常objectnotfoundexception,所說的load方法拋異常是指在使用該物件的資料時,資料庫中不存在該資料

時拋異常,而不是在建立這個物件時。由於session中的快取對於hibernate來說是個相當廉價的資源,所以在load時會先查一下

session快取看看該id對應的物件是否存在,不存在則建立**。所以如果你知道該id在資料庫中一定有對應記錄存在就可以使用load方法來實現延

遲載入。

對於get方法,hibernate會確認一下該id對應的資料是否存在,首先在session快取中查詢,然後在二級快取中查詢,還沒有就查資料庫,資料庫中沒有就返回null。

雖然好多書中都這麼說:「get()永遠只返回實體類」,但實際上這是不正確的,get方法如果在session快取中找到了該id對應的物件,如果剛好該

物件前面是被**過的,如被load方法使用過,或者被其他關聯物件延遲載入過,那麼返回的還是原先的**物件,而不是實體類物件,如果該**物件還沒有

載入實體資料(就是id以外的其他屬性資料),那麼它會查詢二級快取或者資料庫來載入資料,但是返回的還是**物件,只不過已經載入了實體資料。

前面已經講了,get方法首先查詢session快取,沒有的話查詢二級快取,最後查詢資料庫;反而load方法建立時首先查詢session快取,沒有就建立**,實際使用資料時才查詢二級快取和資料庫。

總之對於get和load的根本區別,一句話,hibernate對於load方法認為該資料在資料庫中一定存在,可以放心的使用**來延遲載入,如果在使用過程中發現了問題,就拋異常;而對於get方法,hibernate一定要獲取到真實的資料,否則返回null。

hibernate中,用load方法獲取物件,但關閉session後,使用get物件的get方法,不什麼不報錯 50

10樓:匿名使用者

一、get和load方法都是根據id去獲得對應資料的,但是獲得機制不同:如果使用get方法,hibernate會去確認該id對應的資料是否存在,它首先會去session中去查詢(session快取其實就hibernate的一級快取),如果沒有,再去二級快取中去查詢,如果再沒有,就去資料庫中查詢,仍然沒有找到的話,就返回null

而使用load方法的話,hibernate會認定該id對應的資料一定存在,它也會先去session快取中去查詢,如果沒有找到,hibernate會根據lazy屬性值來確定是否使用延遲載入。如果lazy=『true』 ,就使用延遲載入,返回該**物件,等到真正訪問到該物件的屬性時才會去二級快取中查詢,如果沒有,再去資料庫中查詢,如果還沒有,就丟擲org.hibernate.

objectnotfoundexception異常。如果lazy='false' 則不使用延遲載入,這是load的訪問機制就和get一樣了。

二、對於load和get方法返回型別:雖然好多書中都這麼說:「get()永遠只返回實體類」,但實際上這是不正確的,get方法如果在 session快取中找到了該id對應的物件,如果剛好該物件前面是被**過的,如被load方法使用過,或者被其他關聯物件延遲載入過,那麼返回的還是 原先的**物件,而不是實體類物件,如果該**物件還沒有載入實體資料(就是id以外的其他屬性資料),那麼它會查詢二級快取或者資料庫來載入資料,但是 返回的還是**物件,只不過已經載入了實體資料。

使用load後不要關閉session 因為在真正要用到資料的時候 load方法要 在session開啟時候傳送sql語句往**物件裝資料

總之對於get和load的根本區別,一句話,hibernate對於load方法認為該資料在資料庫中一定存在,可以放心的使用**來延遲載入,如果在使用過程中發現了問題,只能拋異常;而對於get方法,hibernate一定要獲取到真實的資料,否則返回null。

hibernate 解釋session的load方法和get方法有什麼不同

11樓:帥弘揚

load()是首先訪問快取,如果沒有則訪問資料庫,get()是直接訪問資料庫!

4.hibernate中session的load和get方法的區別是什麼

12樓:

hibernate中get方法和load方法的根本區別

如果你使用load方法,hibernate認為該id對應的物件(資料庫記錄)在資料

庫中是一定存在的,所以它可以放心的使用,它可以放心的使用**來延遲載入該物件。在用到物件中的其他屬性資料時才查詢資料庫,但是萬一資料庫中不存在該

記錄,那沒辦法,只能拋異常objectnotfoundexception,所說的load方法拋異常是指在使用該物件的資料時,資料庫中不存在該資料

時拋異常,而不是在建立這個物件時。由於session中的快取對於hibernate來說是個相當廉價的資源,所以在load時會先查一下

session快取看看該id對應的物件是否存在,不存在則建立**。所以如果你知道該id在資料庫中一定有對應記錄存在就可以使用load方法來實現延

遲載入。

對於get方法,hibernate會確認一下該id對應的資料是否存在,首先在session快取中查詢,然後在二級快取中查詢,還沒有就查資料庫,資料庫中沒有就返回null。

雖然好多書中都這麼說:「get()永遠只返回實體類」,但實際上這是不正確的,get方法如果在session快取中找到了該id對應的物件,如果剛好該

物件前面是被**過的,如被load方法使用過,或者被其他關聯物件延遲載入過,那麼返回的還是原先的**物件,而不是實體類物件,如果該**物件還沒有

載入實體資料(就是id以外的其他屬性資料),那麼它會查詢二級快取或者資料庫來載入資料,但是返回的還是**物件,只不過已經載入了實體資料。

前面已經講了,get方法首先查詢session快取,沒有的話查詢二級快取,最後查詢資料庫;反而load方法建立時首先查詢session快取,沒有就建立**,實際使用資料時才查詢二級快取和資料庫。

總之對於get和load的根本區別,一句話,hibernate對於load方法認為該資料在資料庫中一定存在,可以放心的使用**來延遲載入,如果在使用過程中發現了問題,就拋異常;而對於get方法,hibernate一定要獲取到真實的資料,否則返回null。

Hibernate中,一級快取的作用有哪些

為了減少應用程式對物理資料來源訪問的次數,從而提高應用程式的執行效能 你從資料庫查個東西 一會你還查這個東西 他就不去資料庫找了 先到快取中找 節省了資源 hibernate的一級快取和二級快取分別是什麼 hibernate的快取包括session的快取和sessionfactory的快取,其中 s...

關於關於錯誤的作文的作文,關於關於錯誤的作文的作文300字。

每個人一生中都會犯錯誤,所以這並不是什麼稀奇的事。但是,如果在犯錯後錯誤的對待錯誤,那就不對了。那是一天晚上放學回家,我把書包往沙發上一扔,一下子坐在沙發上,只聽 啪嗒 一聲,我一看,原來是電視遙控器掉在地上摔碎了一個角,這下糟了,媽媽知道了肯定會非常生氣。我後悔極了。這可怎麼辦呢?我連忙找了一個地...

關於展望的成語,關於關於理想的成語

遠來矚 瞻 視,望 源 矚 注視。站得高,看得遠。比喻眼光遠大。繼往開來 繼承前人的事業,開闢未來的道路。來日正長 將來的日子還長著呢。表示事有可為或將來還有機會。似水流年 光陰像川流不息的江水 一去不復返。比喻光陰過得很快心馳神往 解釋 馳 賓士。心神奔向所向往的事物。形容一心向往。出處 隋書 史...