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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 通過示例了解 Hibernate 一級緩存 > 原文: [https://howtodoinjava.com/hibernate/understanding-hibernate-first-level-cache-with-example/](https://howtodoinjava.com/hibernate/understanding-hibernate-first-level-cache-with-example/) 緩存是 ORM 框架提供的一項功能,可幫助用戶獲得快速運行的 Web 應用,同時幫助框架本身減少單個事務中對數據庫的查詢數量。 Hibernate 通過實現一級緩存來實現第二個目標。 **Hiberate 中的第一級緩存**默認情況下處于啟用狀態,并且您無需執行任何操作即可使此功能正常工作。 實際上,您甚至不能強行禁用它。 如果我們了解**與會話對象**關聯的事實,那么就很容易理解第一級緩存。 我們知道,會話對象是按需從會話工廠創建的,**一旦會話關閉**就會丟失。 同樣,與會話對象關聯的一級緩存僅在會話對象處于活動狀態之前可用。 它僅對會話對象可用,并且**對于應用任何其他部分中的任何其他會話對象**均不可訪問。 ![Hibernate first level cache](https://img.kancloud.cn/fb/15/fb15bd0c1217c821dd7b857daf81ea7e_441x273.png "Hibernate first level cache") ## 重要事實 1. 一級緩存與“會話”對象關聯,應用中的其他會話對象看不到它。 2. 緩存對象的范圍是會話。 一旦會話關閉,緩存的對象將永遠消失。 3. 默認情況下,第一級緩存處于啟用狀態,您不能禁用它。 4. 當我們第一次查詢實體時,它是從數據庫中檢索出來的,并存儲在與 Hiberate 會話相關的一級緩存中。 5. 如果我們使用相同的會話對象再次查詢相同的對象,則會從緩存中加載該對象,并且不會執行任何 SQL 查詢。 6. 可以使用`evict()`方法從會話中刪除已加載的實體。 如果已使用`evict()`方法刪除了該實體,則該實體的下一次加載將再次進行數據庫調用。 7. 可以使用`clear()`方法刪除整個會話緩存。 它將刪除所有存儲在緩存中的實體。 讓我們使用示例驗證以上事實。 ## 一級緩存檢索示例 在此示例中,我使用 Hiberate 會話從數據庫中檢索`DepartmentEntity`對象。 我將多次檢索它,并將觀察 sql 日志以查看差異。 ```java //Open the hibernate session Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); //fetch the department entity from database first time DepartmentEntity department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1)); System.out.println(department.getName()); //fetch the department entity again department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1)); System.out.println(department.getName()); session.getTransaction().commit(); HibernateUtil.shutdown(); Output: Hibernate: select department0_.ID as ID0_0_, department0_.NAME as NAME0_0_ from DEPARTMENT department0_ where department0_.ID=? Human Resource Human Resource ``` 如您所見,**第二個“`session.load()`”語句不會再次執行`select`查詢并直接加載部門實體**。 ## 使用新會話的一級緩存檢索示例 **對于新會話,無論實體是否已存在于應用的任何其他會話中,都將從數據庫中再次獲取實體。** ```java //Open the hibernate session Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Session sessionTemp = HibernateUtil.getSessionFactory().openSession(); sessionTemp.beginTransaction(); try { //fetch the department entity from database first time DepartmentEntity department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1)); System.out.println(department.getName()); //fetch the department entity again department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1)); System.out.println(department.getName()); department = (DepartmentEntity) sessionTemp.load(DepartmentEntity.class, new Integer(1)); System.out.println(department.getName()); } finally { session.getTransaction().commit(); HibernateUtil.shutdown(); sessionTemp.getTransaction().commit(); HibernateUtil.shutdown(); } Output: Hibernate: select department0_.ID as ID0_0_, department0_.NAME as NAME0_0_ from DEPARTMENT department0_ where department0_.ID=? Human Resource Human Resource Hibernate: select department0_.ID as ID0_0_, department0_.NAME as NAME0_0_ from DEPARTMENT department0_ where department0_.ID=? Human Resource ``` 您可以看到,即使部門實體存儲在“`session`”對象中,當我們使用另一個會話對象“`sessionTemp`”時,仍然執行了另一個數據庫查詢。 ## 從一級緩存中刪除緩存對象的示例 盡管我們不能在 Hiberate 中禁用一級緩存,但是我們可以在需要時從其中刪除一些對象。 這可以通過兩種方法完成: * `evct()` * `clear()` 這里`evict()`用于從與會話關聯的緩存中刪除特定對象,`clear()`方法用于從會話關聯的緩存中刪除所有對象。 因此,它們本質上就像刪除一個并刪除所有。 ```java //Open the hibernate session Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); try { //fetch the department entity from database first time DepartmentEntity department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1)); System.out.println(department.getName()); //fetch the department entity again department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1)); System.out.println(department.getName()); session.evict(department); //session.clear(); department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1)); System.out.println(department.getName()); } finally { session.getTransaction().commit(); HibernateUtil.shutdown(); } Output: Hibernate: select department0_.ID as ID0_0_, department0_.NAME as NAME0_0_ from DEPARTMENT department0_ where department0_.ID=? Human Resource Human Resource Hibernate: select department0_.ID as ID0_0_, department0_.NAME as NAME0_0_ from DEPARTMENT department0_ where department0_.ID=? Human Resource ``` 顯然,`evict()`方法從高速緩存中刪除了部門對象,以便再次從數據庫中獲取它。 希望你喜歡上面的文章。 如果您有任何問題或建議,請發表評論。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看