91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

怎么在Hibernate中實例化集合和代理

發布時間:2021-12-04 16:33:19 來源:億速云 閱讀:141 作者:iii 欄目:編程語言

本篇內容主要講解“怎么在Hibernate中實例化集合和代理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么在Hibernate中實例化集合和代理”吧!

Hibernate中實例化集合和代理在Session范圍之外訪問未初始化的集合或代理,Hibernate將會拋出LazyInitializationException異常。 也就是說,在分離狀態下,訪問一個實體所擁有的集合,或者訪問其指向代理的屬性時,會引發此異常。

有時候我們需要保證某個代理或者集合在Session關閉前就已經被初始化了。 當然,我們可以通過強行調用cat.getSex()或者cat.getKittens().size()之類的方法來確保這一點。 但是這樣的程序會造成讀者的疑惑,也不符合通常的代碼規范。

靜態方法Hibernate.initialized() 為你的應用程序提供了一個便捷的途徑來延遲加載集合或代理。 只要它的Session處于open狀態,Hibernate.initialize(cat) 將會為cat強制對代理實例化。 同樣,Hibernate.initialize( cat.getKittens() ) 對kittens的集合具有同樣的功能。

還有另外一種選擇,就是保持Session一直處于open狀態,直到所有需要的集合或代理都被載入。 在某些應用架構中,特別是對于那些使用Hibernate進行數據訪問的代碼,以及那些在不同應用層和不同物理進程中使用Hibernate的代碼。 在集合實例化時,如何保證Session處于open狀態經常會是一個問題。有兩種方法可以解決此問題:

在一個基于Web的應用中,可以利用servlet過濾器(filter),在用戶請求(request)結束、頁面生成 結束時關閉Session(這里使用了在展示層保持打開Session模式(Open Session in View)), 當然,這將依賴于應用框架中異常需要被正確的處理。

在返回界面給用戶之前,乃至在生成界面過程中發生異常的情況下, 正確關閉Session和結束事務將是非常重要的, 請參見Hibernate wiki上的"Open Session in View"模式,你可以找到示例。

在一個擁有單獨業務層的應用中,業務層必須在返回之前,為web層“準備”好其所需的數據集合。這就意味著 業務層應該載入所有表現層/web層所需的數據,并將這些已實例化完畢的數據返回。

通常,應用程序應該 為web層所需的每個集合調用Hibernate.initialize()(這個調用必須發生咱session關閉之前); 或者使用帶有FETCH從句,或FetchMode.JOIN的Hibernate查詢, 事先取得所有的數據集合。

如果你在應用中使用了Command模式,代替Session Facade , 那么這項任務將會變得簡單的多。

你也可以通過merge()或lock()方法,在訪問未實例化的集合(或代理)之前, 為先前載入的對象綁定一個新的Session。

顯然,Hibernate將不會,也不應該自動完成這些任務,因為這將引入一個特殊的事務語義。

有時候,你并不需要完全實例化整個大的集合,僅需要了解它的部分信息(例如其大小)、或者集合的部分內容。

你可以使用集合過濾器得到其集合的大小,而不必實例化整個集合:

( (Integer) s.createFilter( collection, "select count(*)" ).list().get(0) ).intValue()

這里的createFilter()方法也可以被用來有效的抓取集合的部分內容,而無需實例化整個集合:

s.createFilter( lazyCollection, "").setFirstResult(0).setMaxResults(10).list();

到此,相信大家對“怎么在Hibernate中實例化集合和代理”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

鹤庆县| 东辽县| 灵丘县| 德兴市| 会同县| 东海县| 榆林市| 永州市| 行唐县| 久治县| 桦川县| 九龙县| 平谷区| 义乌市| 神农架林区| 防城港市| 达拉特旗| 从化市| 甘孜县| 托克逊县| 怀仁县| 霍邱县| 南陵县| 闵行区| 汾阳市| 扎赉特旗| 通辽市| 佛坪县| 陆丰市| 永吉县| 赤水市| 光山县| 南宫市| 尼木县| 大名县| 南漳县| 鲜城| 新乡市| 巴林右旗| 罗定市| 岗巴县|