日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate深入之get()与load()懒加载

發布時間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate深入之get()与load()懒加载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??? 前面講過get和load,一個是直接加載,并不是直接去數據庫查詢,如果緩存里有,首先到緩存里找,緩存分為一級緩存和二級緩存,首先到一級緩存中查找;

??? 如果在session關閉之后進行獲取類的名字之類的屬性,依然會獲取到,例:

??? Order od = (Order) session.get(Order.class, 1);

??? 通過get獲取的Order類是一個持久化類,如果session關閉之后進行獲取,od.getName,它就會變成托管狀態,但是這個對象還是有的,所以沒事;

??? 另一個是懶加載,他不會直接進行操作,就是除了獲取id(標識符)和類.class時,獲取其他的類屬性都會進行操作,

??? 例:

??? Account? acc=(Account)session.load(Account.class,new Long(1));??? //返回一個代理對象

??? System.out.println(acc.getId);

??? System.out.prontln(acc.getLonginName());

??? 這里的1是一個代理對象,如果只獲取他的id,則不會加載,不會出現select語句,只有獲取除他和本身之外才會進行查找;否則訪問的只是他的代理對象而已;如果需要取消懶加載,就只需要在你想獲取的類屬性的映射文件的<class name=”” table=”” lazy=”false”>把他改為false就可以了,這樣懶加載就取消了,這里只對load管用,對get()毫無影響;

??? 如果把他System.out.prontln(acc.getLonginName());放在session關閉之后,則會出現錯誤,因為這里只產生了一個代理對象,沒有真正去查,把session關之后,他會去查數據庫,要發出sql語句,因為發出sql語句需要在session里面,所以session關了之后,就不能使用了;

??? 接下來說一說他們之間的區別:

??? 延遲加載的過程:通過代理(Proxy)機制來實現延遲加載。Hibernate從數據庫獲取某一個對象數據時、獲取某一個對象的集合屬性值時,或獲取某一個對象所關聯的另一個對象時,由于沒有使用該對象的數據(除標識符外),Hibernate并不從數據庫加載真正的數據,而只是為該對象創建一個代理對象來代表這個對象,這個對象上的所有屬性都為默認值;只有在真正需要使用該對象的數據時才創建這個真正的對象,真正從數據庫中加載它的數據。

??? 如果只是訪問對象標示符屬性,就沒有必要初始化代碼。

??? Account? acc=(Account)session.load(Account.class,new Long(1));??? //返回一個代理對象

??? Order order=new Order();

??? order.setCreateTime(new Date());

??? order.setAccount(acc);

??? Session.save(order);

??? 在這只需要Account實例來創建一個新的Order訂單對象,當調用session.save(order)時,也只需要Account的主標示符值作為外鍵保存到訂單表的對應字段中。這樣就少執行一條select語句,從而提高查詢效率。

??? Hibernate中默認采用延遲加載的情況主要有以下幾種:

??? 當調用Session上的load()方法加載一個實體時,會采用延遲加載。

??? 當Session加載某個實體時,會對這個實體中的集合屬性值采用延遲加載。(one-to-many)

??? 例:當Client這個類里具有集合屬性,

??????? Client client = (Client) session.get(Client.class, 4);

??????? System.out.println(client.getName());

??????? 獲取他的名字,你會發現只有一條sql語句,因為采用了延遲加載,所以如果想 ?

??????? 取消,就在該映射文件下<set>里面把lazy改成false;

??? 當Session加載某個實體時,會對這個實體所單端關聯(one-to-one,? many-to-one)的另一個實體對象采用延遲加載。

??? 能夠懶加載的對象都是被改寫過的代理對象,當相關聯的session沒有關閉時,訪問這些懶加載對象(代理對象)的屬性(getId和getClass除外)hibernate會初始化這些代理,或用Hibernate.initialize(proxy)來初始化代理對象;當相關聯的session關閉后,再訪問懶加載的對象將出現異常。

2、 關閉延遲加載

??? 在加載單個實體時,如果不需要延遲加載,就可以使用session的get()方法。

??? 當Session加載某個實體時,不需要對這個實體中的集合屬性值延遲加載,而是要立即加載。這時可以在映射文件中針對 這個集合屬性的配置元素(<set>,<bag>,<list>…)添加屬性lazy=“false”。

??? 當Session加載某個實體時,不需要對這個實體所單端關聯的另一個實體對象延遲加載,就可以在映射文件中對這個單端關聯的配置元素(<one-to-one>,<many-to-one> )添加屬性lazy=“false”。

??? 注意:one-to-one不能有constrained=true

轉載于:https://www.cnblogs.com/pengw/p/3983167.html

總結

以上是生活随笔為你收集整理的Hibernate深入之get()与load()懒加载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。