<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 19.1.3\. 單端關聯代理(Single-ended association proxies) 在Hinerbate中,對集合的延遲抓取的采用了自己的實現方法。但是,對于單端關聯的延遲抓取,則需要采用 其他不同的機制。單端關聯的目標實體必須使用代理,Hihernate在運行期二進制級(通過優異的CGLIB庫), 為持久對象實現了延遲載入代理。 默認的,Hibernate3將會為所有的持久對象產生代理(在啟動階段),然后使用他們實現 `多對一(many-to-one)`關聯和`一對一(one-to-one)` 關聯的延遲抓取。 在映射文件中,可以通過設置`proxy`屬性為目標class聲明一個接口供代理接口使用。 默認的,Hibernate將會使用該類的一個子類。 _注意:被代理的類必須實現一個至少包可見的默認構造函數,我們建議所有的持久類都應擁有這樣的構造函數_ 在如此方式定義一個多態類的時候,有許多值得注意的常見性的問題,例如: ``` <class name="Cat" proxy="Cat"> ...... <subclass name="DomesticCat"> ..... </subclass> </class> ``` 首先,`Cat`實例永遠不可以被強制轉換為`DomesticCat`, 即使它本身就是`DomesticCat`實例。 ``` Cat cat = (Cat) session.load(Cat.class, id); // instantiate a proxy (does not hit the db) if ( cat.isDomesticCat() ) { // hit the db to initialize the proxy DomesticCat dc = (DomesticCat) cat; // Error! .... } ``` 其次,代理的“`==`”可能不再成立。 ``` Cat cat = (Cat) session.load(Cat.class, id); // instantiate a Cat proxy DomesticCat dc = (DomesticCat) session.load(DomesticCat.class, id); // acquire new DomesticCat proxy! System.out.println(cat==dc); // false ``` 雖然如此,但實際情況并沒有看上去那么糟糕。雖然我們現在有兩個不同的引用,分別指向這兩個不同的代理對象, 但實際上,其底層應該是同一個實例對象: ``` cat.setWeight(11.0); // hit the db to initialize the proxy System.out.println( dc.getWeight() ); // 11.0 ``` 第三,你不能對“final類”或“具有final方法的類”使用CGLIB代理。 最后,如果你的持久化對象在實例化時需要某些資源(例如,在實例化方法、默認構造方法中), 那么代理對象也同樣需要使用這些資源。實際上,代理類是持久化類的子類。 這些問題都源于Java的單根繼承模型的天生限制。如果你希望避免這些問題,那么你的每個持久化類必須實現一個接口, 在此接口中已經聲明了其業務方法。然后,你需要在映射文檔中再指定這些接口。例如: ``` <class name="CatImpl" proxy="Cat"> ...... <subclass name="DomesticCatImpl" proxy="DomesticCat"> ..... </subclass> </class> ``` 這里`CatImpl`實現了`Cat`接口, `DomesticCatImpl`實現`DomesticCat`接口。 在`load()`、`iterate()`方法中就會返回 `Cat`和`DomesticCat`的代理對象。 (注意`list()`并不會返回代理對象。) ``` Cat cat = (Cat) session.load(CatImpl.class, catid); Iterator iter = session.iterate("from CatImpl as cat where cat.name='fritz'"); Cat fritz = (Cat) iter.next(); ``` 這里,對象之間的關系也將被延遲載入。這就意味著,你應該將屬性聲明為`Cat`,而不是`CatImpl`。 但是,在有些方法中是_不需要_使用代理的。例如: * `equals()`方法,如果持久類沒有重載`equals()`方法。 * `hashCode()`方法,如果持久類沒有重載`hashCode()`方法。 * 標志符的getter方法。 Hibernate將會識別出那些重載了`equals()`、或`hashCode()`方法的持久化類。 若選擇`lazy="no-proxy"`而非默認的`lazy="proxy"`,我們可以避免類型轉換帶來的問題。然而,這樣我們就需要編譯期字節碼增強,并且所有的操作都會導致立刻進行代理初始化。
                  <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>

                              哎呀哎呀视频在线观看