中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

hibernate中get和load的區別

發布時間:2020-06-24 17:24:56 來源:網絡 閱讀:385 作者:J星星點燈 欄目:數據庫

 1. get是立即執行sql語句,load是只有訪問了對象的非id屬性時才執行sql語句

 2. get獲取一個對象時,如果找不到,則返回null, load獲取對象時,如果找不到,則拋出ObjectNotFoundException

 3. get獲取到的對象是一個真實類型的對象,load獲取到的對象是一個代理對象,代理對象的類是Hibernate自己創建的類,該類是真實類的子類!

    如何禁用load的延遲加載:

    a. 給真實的User類加上final修飾符。

    b. 在User.hbm.xml的<class>元素上添加一個lazy="false"


hibernate中sql的執行時間:

    

1. 當一個對象從沒有OID (Object id) 到有 OID的時候,就立即執行sql語句。

 2. 當一個對象從有OID (Object id) 到有 OID的時候,就會才事務提交的時候才執行sql語句。

 

 3. load是類級別的延遲加載,當我們使用load加載應數據庫中的對象時,如果該對象從來沒有使用過,則hibernate根本不查庫!

        只有訪問了該對象的非id屬性時,才執行sql語句!!


補充:

    

hibernate中get方法和load方法的根本區別在于:如果你使用load方法,hibernate認 為該id對應的對象(數據庫記錄)在數據庫中是一定存在的,所以它可以放心的使用,它可以放心的使用代理來延遲加載該對象。在用到對象中的其他屬性數據時 才查詢數據庫,但是萬一數據庫中不存在該記錄,那沒辦法,只能拋異常,所說的load方法拋異常是指在使用該對象的數據時,數據庫中不存在該數據時拋異 常,而不是在創建這個對象時。由于session中的緩存對于hibernate來說是個相當廉價的資源,所以在load時會先查一下session緩存 看看該id對應的對象是否存在,不存在則創建代理。所以如果你知道該id在數據庫中一定有對應記錄存在就可以使用load方法來實現延遲加載。 

    對于get方法,hibernate會確認一下該id對應的數據是否存在,首先在session緩存中查找,然后在二級緩存中查找,還沒有就查數據庫,數據庫中沒有就返回null。

    對于load和get方法返回類型:雖然好多書中都這么說:“get()永遠只返回實體類”,但實際上這是不正確的,get方法如果在 session緩存中找到了該id對應的對象,如果剛好該對象前面是被代理過的,如被load方法使用過,或者被其他關聯對象延遲加載過,那么返回的還是 原先的代理對象,而不是實體類對象,如果該代理對象還沒有加載實體數據(就是id以外的其他屬性數據),那么它會查詢二級緩存或者數據庫來加載數據,但是 返回的還是代理對象,只不過已經加載了實體數據。

    get方法首先查詢session緩存,沒有的話查詢二級緩存,最后查詢數據庫;反而load方法創建時首先查詢session緩存,沒有就創建代理,實際使用數據時才查詢二級緩存和數據庫。

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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

志丹县| 马公市| 高青县| 汝阳县| 邻水| 开封县| 枞阳县| 陈巴尔虎旗| 呼伦贝尔市| 日喀则市| 福贡县| 来凤县| 舒兰市| 区。| 邵阳市| 阿拉善左旗| 宿迁市| 定结县| 瑞昌市| 中江县| 霸州市| 永顺县| 罗甸县| 林芝县| 阿坝| 屏边| 彩票| 张家口市| 响水县| 河池市| 简阳市| 县级市| 高雄市| 洛南县| 汝南县| 上蔡县| 新昌县| 沙湾县| 田林县| 玉田县| 花垣县|