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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Hibernate 延遲加載教程 > 原文: [https://howtodoinjava.com/hibernate/lazy-loading-in-hibernate/](https://howtodoinjava.com/hibernate/lazy-loading-in-hibernate/) 在任何應用中,Hiberate 都以急切或延遲模式從數據庫讀取數據。 **Hiberate 延遲加載**是指按需延遲加載數據時的策略。 ## 1\. Hiberate 延遲加載 - 我們為什么需要它? 考慮一種常見的互聯網 Web 應用:在線商店。 商店維護產品目錄。 在最原始的級別上,可以將其建模為管理一系列產品實體的目錄實體。 在一家大型商店中,可能有成千上萬種產品歸為各種重疊類別。 當客戶端訪問商店時,必須從數據庫中加載目錄。 我們可能不希望實現將代表成千上萬種產品的每個實體中的每一個加載到內存中。 對于足夠大的零售商,鑒于機器上可用的物理內存量,這甚至可能是不可能的。 即使這是可能的,也可能會削弱網站的性能。 相反,我們只希望加載目錄,可能還需要加載類別。 僅當用戶向下鉆取類別時,才應從數據庫中加載該類別中的一部分產品。 為了解決此問題,Hibernate 提供了一種名為**延遲加載**的工具。 啟用后,僅當直接請求實體的關聯實體時,才會加載它們。 ## 2\. 延遲加載如何解決上述問題 現在,當我們了解了問題之后,讓我們了解延遲加載實際上如何在現實生活中提供幫助。 如果我們考慮解決上面討論的問題,那么我們將以以下方式訪問類別(或目錄): ```java //Following code loads only a single category from the database: Category category = (Category)session.get(Category.class,new Integer(42)); ``` 但是,如果訪問了該類別的所有產品,并且執行了延遲加載,則會根據需要從數據庫中拉出產品。 例如,在以下代碼段中,將加載關聯的產品對象,因為在第二行中已明確引用了該產品。 ```java //Following code loads only a single category from the database Category category = (Category)session.get(Category.class,new Integer(42)); //This code will fetch all products for category 42 from database - "NOW" Set<Product> products = category.getProducts(); ``` 這解決了我們僅在需要時才加載產品的問題。 ## 3\. 如何在 Hiberate 下啟用延遲加載 在進一步進行操作之前,重要的是要重述延遲加載的默認行為,以防使用 Hiberate 映射和注解。 默認行為是緊急加載“屬性值”和延遲加載“集合”。 如果您以前使用過普通的 Hibernate 2(映射文件),則默認情況下會急切加載所有引用(包括集合),這與您可能會記得的相反。 另請注意,[`@OneToMany`](https://howtodoinjava.com/hibernate/hibernate-one-to-many-mapping-using-annotations/)和`@ManyToMany`關聯默認為`LAZY`加載; [`@OneToOne`](https://howtodoinjava.com/hibernate/hibernate-one-to-one-mapping-using-annotations/)和`@ManyToOne`默認為 EAGER 加載。 記住這一點很重要,以避免將來出現任何陷阱。 要顯式啟用延遲加載,必須在使用 Hiberate 注解時要延遲加載的關聯上使用“`fetch = FetchType.LAZY`”。 一個 **hibernare 延遲加載示例**如下所示: ```java @OneToMany( mappedBy = "category", fetch = FetchType.LAZY ) private Set<ProductEntity> products; ``` 與`"FetchType.LAZY"`平行的另一個屬性是`"FetchType.EAGER"`,它與`LAZY`正好相反,即,當首次獲取所有者實體時,它也會加載關聯實體。 ## 4\. 延遲加載在 Hiberate 下如何工作 Hibernate 可以在實體和關聯上應用延遲加載行為的最簡單方法是提供它們的代理實現。 Hibernate 通過替換從實體類派生的代理來攔截對實體的調用。 如果缺少所需信息,將從控制權移交給上級實體的實現之前將其從數據庫中加載。 請注意,當關聯表示為集合類時,將創建包裝器(本質上是集合的代理,而不是集合所包含的實體),并替換為原始集合。 當您訪問該集合代理時,您在返回的代理集合中得到的不是代理實體;它是代理實體。 而是它們是實際的實體。 您無需在理解此概念上施加太大壓力,因為在運行時幾乎沒有關系。 ## 5\. 延遲加載對分離實體的影響 如我們所知,Hiberate 只能通過會話訪問數據庫,因此,如果實體與會話分離,并且當我們嘗試訪問尚未加載的關聯(通過代理或集合包裝器)時,**Hibernate 拋出`LazyInitializationException`**。 解決方法是確保通過將實體附加到會話來使該實體再次成為持久化,或者確保在將實體從會話中分離之前,將訪問所有需要的字段(將它們加載到實體中)。 這就是這個簡單但非常重要的概念,即**如何在 Hiberate** 中加載延遲對象。 對于 **Hiberate 獲取策略**[面試問題](https://howtodoinjava.com/java-interview-questions/)的初學者來說,這可能是一個問題。 如果不清楚或您想討論任何事情,請發表評論。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看