<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Hiberate 合并和刷新實體 > 原文: [https://howtodoinjava.com/hibernate/merging-and-refreshing-hibernate-entities/](https://howtodoinjava.com/hibernate/merging-and-refreshing-hibernate-entities/) 在先前的教程中,我們了解了在 Hiberate 中使用`save()`或`saveOrUpdate()`方法[**保存實體**](//howtodoinjava.com/hibernate/save-and-saveorupdate-for-saving-hibernate-entities/ "Save() and saveOrUpdate() for Saving Hibernate Entities")的知識。 從中我們了解到,在大多數情況下,您甚至都不需要那些方法,因為 hibernate 自動管理[**持久實體**](//howtodoinjava.com/hibernate/hibernate-entity-persistence-lifecycle-states/ "Hibernate Entity / Persistence LifeCycle States")上的更新。 在大多數情況下,您只需要關心瞬態對象。 在本教程中,我將討論有關 Hiberate 會話類中存在的`refresh()`和`merge()`方法的一些想法。 ## 使用`refresh()`方法刷新 Hiberate 實體 有時,我們會遇到這樣的情況:我們的應用數據庫被某些外部應用/代理修改,因此您的應用中的相應 Hiberate 實體實際上與其數據庫表示不同步,即具有舊數據。 在這種情況下,可以使用`session.refresh()`方法用數據庫中可用的最新數據重新填充實體。 您可以在`Session`接口上使用`refresh()`方法之一來刷新持久對象的實例,如下所示: ```java public void refresh(Object object) throws HibernateException public void refresh(Object object, LockMode lockMode) throws HibernateException ``` 這些方法將從數據庫重新加載對象的屬性,并覆蓋它們。 在現實生活中的應用中,除了上述情況之外,您不必經常使用`refresh()`方法。 我們來看一個`refresh()`方法的示例。 ```java public class RefreshEntityExample { public static void main(String[] args) { Session sessionOne = HibernateUtil.getSessionFactory().openSession(); sessionOne.beginTransaction(); //Create new Employee object EmployeeEntity emp = new EmployeeEntity(); emp.setEmployeeId(1); emp.setFirstName("Lokesh"); emp.setLastName("Gupta"); //Save employee sessionOne.save(emp); sessionOne.getTransaction().commit(); sessionOne.close(); //Verify employee's firstname System.out.println(verifyEmployeeFirstName(1, "Lokesh")); Session sessionTwo = HibernateUtil.getSessionFactory().openSession(); sessionTwo.beginTransaction(); //This emp.setFirstName("Vikas"); sessionTwo.refresh(emp); sessionTwo.getTransaction().commit(); sessionTwo.close(); System.out.println(emp.getFirstName().equals("Lokesh")); HibernateUtil.shutdown(); } private static boolean verifyEmployeeFirstName(Integer employeeId, String firstName){ Session session = HibernateUtil.getSessionFactory().openSession(); EmployeeEntity employee = (EmployeeEntity) session.load(EmployeeEntity.class, employeeId); //Verify first name boolean result = firstName.equals(employee.getFirstName()); session.close(); //Return verification result return result; } } Output: true true ``` 查看突出顯示的線條上方。 * 第 15 行以“`Lokesh`”的名字保存員工 * 第 26 行設置了名字“`Vikas`”。 由于實體已分離,因此不會更新數據庫。 * 第 27 行使用`refresh()`方法用數據庫刷新實體。 * 第 32 行驗證在實體中設置的名字是否已用“`Lokesh`”更新,因為這是數據庫當前所擁有的名字。 這全部與刷新方法有關。 讓我們看另一種類似的方法`merge()`。 ## 使用`merge()`方法合并 Hiberate 實體 方法`merge()`與`refresh()`的作用完全相反,即,它使用來自分離實體的值更新數據庫。 刷新方法是使用最新的數據庫信息更新實體。 所以基本上,兩者是完全相反的。 當您希望將**分離實體再次更改為持久狀態**時執行合并,并且將分離實體的更改遷移到(或覆蓋)數據庫。 合并操作的方法簽名為: ```java Object merge(Object object) Object merge(String entityName, Object object) ``` Hibernate 官方文檔對`merge()`方法給出了很好的解釋: 將給定對象的狀態復制到具有相同標識符的持久對象上。 如果當前沒有與該會話關聯的持久化實例,則將其加載。 返回持久實例。 如果給定實例未保存,請保存的副本并將其作為新的持久實例返回。 給定的實例不與會話關聯。 如果關聯是用`cascade="merge"`映射的,則此操作將級聯到關聯的實例。 因此,如果我以下面的代碼為例,那么下面列出的幾點對您來說應該很清楚。 ```java EmployeeEntity mergedEmpEntity = session.merge(empEntity); ``` * 當`empEntity`傳遞給`merge()`方法時,它是分離的實體。 * `merge()`方法將使用從`empEntity`獲取的標識符信息搜索已加載的`EmployeeEntity`實例。 如果找到了這樣的持久化實體,那么它將用于更新。 否則,將使用`empEntity`中存在的相同標識符信息將新的`EmployeeEntity`加載到會話中。 * 數據從`empEntity`復制到新發現/加載的實體。 * 由于新實體/發現實體是永久性的,因此從`empEntity`復制到該實體的所有數據都會自動保存到數據庫中。 * 從`merge()`方法返回對該新實體的引用,并將其分配給`mergedEmpEntity`變量。 * `empEntity`仍然是獨立實體。 ```java public class MergeEntityExample { public static void main(String[] args) { Session sessionOne = HibernateUtil.getSessionFactory().openSession(); sessionOne.beginTransaction(); //Create new Employee object EmployeeEntity emp = new EmployeeEntity(); emp.setEmployeeId(1); emp.setFirstName("Lokesh"); emp.setLastName("Gupta"); //Save employee sessionOne.save(emp); sessionOne.getTransaction().commit(); sessionOne.close(); //Verify employee's firstname System.out.println(verifyEmployeeFirstName(1, "Lokesh")); Session sessionTwo = HibernateUtil.getSessionFactory().openSession(); sessionTwo.beginTransaction(); //Set new first name emp.setFirstName("Vikas"); //Merge the emp object using merge() method EmployeeEntity mergedPersistentEmpEntity = (EmployeeEntity) sessionTwo.merge(emp); sessionTwo.getTransaction().commit(); sessionTwo.close(); //Verify employee's firstname again in database System.out.println(verifyEmployeeFirstName(1, "Vikas")); HibernateUtil.shutdown(); } private static boolean verifyEmployeeFirstName(Integer employeeId, String firstName){ Session session = HibernateUtil.getSessionFactory().openSession(); EmployeeEntity employee = (EmployeeEntity) session.load(EmployeeEntity.class, employeeId); //Verify first name boolean result = firstName.equals(employee.getFirstName()); session.close(); //Return verification result return result; } } Output: true true ``` 在上面的示例中,`mergedPersistentEmpEntity`是具有持久化的新實體。 因此,如果您想進行其他更改,請輸入`mergedPersistentEmpEntity`實例。 本教程涵蓋了 Hiberate 中的`merge()`和`refresh()`方法。 請記住,可以問以下問題:`merge()`和`refresh()`之間的差異,或`merge()`和`load()`之間的差異等。準備好在[**面試問題**](//howtodoinjava.com/java-interview-questions/ "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>

                              哎呀哎呀视频在线观看