亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

维西| 荥经县| 普定县| 拉萨市| 仙居县| 丰城市| 蛟河市| 靖边县| 邵东县| 无极县| 平南县| 巴马| 红安县| 嘉峪关市| 龙海市| 美姑县| 连江县| 八宿县| 井陉县| 尉氏县| 张家界市| 玉龙| 伊宁市| 尼勒克县| 左云县| 河西区| 乌拉特后旗| 绥宁县| 长沙市| 庄河市| 资讯| 交城县| 吴堡县| 兰州市| 迁安市| 陵水| 祁连县| 靖安县| 贡山| 扬中市| 彭州市|