<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 19.1.4\. 實例化集合和代理(Initializing collections and proxies) 在`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(); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看