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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Hiberate `save()`和`saveOrUpdate()`方法 > 原文: [https://howtodoinjava.com/hibernate/hibernate-save-and-saveorupdate/](https://howtodoinjava.com/hibernate/hibernate-save-and-saveorupdate/) [**Hiberate**](//howtodoinjava.com/hibernate-tutorials/ "Hibernate Tutorials") 僅與[**持久實體**](//howtodoinjava.com/hibernate/hibernate-entity-persistence-lifecycle-states/ "Hibernate Entity / Persistence LifeCycle States")一起使用,并且持久實體是附加到任何 Hiberate 會話的類。 請注意,使用 Hiberate 注解映射的類的實例的創建不會自動將對象持久保存到數據庫中。 將其附加到有效的 Hiberate 會話后,必須顯式保存它。 在本教程中,學習在不同用例下使用 hibernate `save()`和`saveOrUpdate()`方法。 ## 1\. Hibernate `save()`方法 在 Hiberate 下,我們通常使用`save()`方法的以下兩個版本之一: ```java public Serializable save(Object object) throws HibernateException public Serializable save(String entityName,Object object) throws HibernateException ``` 兩種`save()`方法都將瞬態對象引用(不能為`null`)作為參數。 第二種方法采用了額外的參數`entityName`,如果您已將多個實體映射到 Java 類,則該參數很有用。 在這里,您可以使用`save()`方法指定要保存的實體。 一個演示 hibernate `save()`方法的簡單示例。 ```java @Entity @Table(name = "Employee") public class EmployeeEntity implements Serializable { private static final long serialVersionUID = -1798070786993154676L; @Id @Column(name = "ID", unique = true, nullable = false) private Integer employeeId; @Column(name = "FIRST_NAME", unique = false, nullable = false, length = 100) private String firstName; @Column(name = "LAST_NAME", unique = false, nullable = false, length = 100) private String lastName; @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof EmployeeEntity)) return false; EmployeeEntity otherEmployee = (EmployeeEntity) o; if (getEmployeeId() != null ? !getEmployeeId().equals(otherEmployee.getEmployeeId()) : otherEmployee.getEmployeeId() != null) return false; if (getFirstName() != null ? !getFirstName().equals(otherEmployee.getFirstName()) : otherEmployee.getFirstName() != null) return false; if (getLastName() != null ? !getLastName().equals(otherEmployee.getLastName()) : otherEmployee.getLastName() != null) return false; return true; } @Override public int hashCode() { int result = getEmployeeId() != null ? getEmployeeId().hashCode() : 0; result = 31 * result + (getFirstName() != null ? getFirstName().hashCode() : 0); result = 31 * result + (getLastName() != null?getLastName().hashCode() : 0); return result; } //Getters and Setters are hidden here } ``` 現在,保存此 Hiberate 實體。 ```java public class SimplestSaveEntityExample { 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(); HibernateUtil.shutdown(); } } ``` 程序輸出。 ```java Hibernate: insert into Employee (FIRST_NAME, LAST_NAME, ID) values (?, ?, ?) ``` #### 1.1 在持久實體上調用`save()`方法 我們保存了`Employee`實體。 太簡單。 但是實際上,它不是那么簡單的用例。 在那里,您可能需要再次更新員工實體,然后在另一個會話中再次保存。 您是否應該再次調用`save()`方法? 我們來看看。 ```java public class SaveEntityAgainInAnotherSession { 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(); Session sessionTwo = HibernateUtil.getSessionFactory().openSession(); sessionTwo.beginTransaction(); emp.setLastName("temp"); //Save employee again second time sessionTwo.save(emp); sessionTwo.getTransaction().commit(); HibernateUtil.shutdown(); } } ``` 程序輸出: ```java Hibernate: insert into Employee (FIRST_NAME, LAST_NAME, ID) values (?, ?, ?) Hibernate: insert into Employee (FIRST_NAME, LAST_NAME, ID) values (?, ?, ?) WARN SqlExceptionHelper:144 - SQL Error: -104, SQLState: 23000 ERROR SqlExceptionHelper:146 - Violation of unique constraint SYS_PK_49: duplicate value(s) for column(s) ID in statement [insert into Employee (FIRST_NAME, LAST_NAME, ID) values (?, ?, ?)] INFO AbstractBatchImpl:208 - HHH000010: On release of batch it still contained JDBC statements ``` Hiberate 在這里試圖再次插入實體。 盡管由于主鍵檢查而導致**失敗**,但其他實體的檢查可能不存在,并且最終可能會出現重復的行。 ***注意***:雖然第二種`save()`方法導致在不同會話中重復行,但是在同一會話中它們將正常工作。 看下面的例子。 ```java public class SaveEntityAgainInSameSession { 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); emp.setLastName("temp"); //Save employee again second time sessionOne.save(emp); sessionOne.getTransaction().commit(); HibernateUtil.shutdown(); } } ``` 程序輸出: ```java Hibernate: insert into Employee (FIRST_NAME, LAST_NAME, ID) values (?, ?, ?) Hibernate: update Employee set FIRST_NAME=?, LAST_NAME=? where ID=? ``` 令人困惑。 對? 讓我們簡單點。 規則如下: 請記住,您不應在持久實體(與任何 Hibernate 會話相關聯的實體)上調用`save()`方法。 對持久實體所做的任何更改都會自動保存。 #### 1.2 持久實體的狀態變化 對持久實體的任何更改都會自動保存。 讓我們以簡單的示例了解這一概念。 ```java public class NoSaveCallForPersistentEntity { 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); emp.setLastName("temp"); sessionOne.getTransaction().commit(); //Let's see what got updated in DB Session sessionTwo = HibernateUtil.getSessionFactory().openSession(); sessionTwo.beginTransaction(); EmployeeEntity employee = ( EmployeeEntity ) sessionTwo.load(EmployeeEntity.class, 1); System.out.println(employee.getLastName()); sessionTwo.getTransaction().commit(); HibernateUtil.shutdown(); } } ``` 程序輸出: ```java Hibernate: insert into Employee (FIRST_NAME, LAST_NAME, ID) values (?, ?, ?) Hibernate: update Employee set FIRST_NAME=?, LAST_NAME=? where ID=? Hibernate: select employeeen0_.ID as ID1_1_0_, employeeen0_.FIRST_NAME as FIRST_NA2_1_0_, employeeen0_.LAST_NAME as LAST_NAM3_1_0_ from Employee employeeen0_ where employeeen0_.ID=? temp ``` 在上面的示例中,我們使用第一種`save()`方法使`emp`對象持久化。 之后,當我們將姓氏更新為“`temp`”時,將按預期執行更新查詢。 我們也在返回的數據中對此進行了驗證。 這是使用 Hiberate 持久化實體的正確方法。 ## 2\. Hiberate `saveOrUpdate()`方法 在討論`save()`方法時,我們忘記了必須在另一個會話中保存持久化實體而導致重復鍵錯誤的情況。 這也是一個有效的方案。 要處理這種情況,必須使用`saveOrUpdate()`方法。 嚴格來說,即使對于非持久化實體,也應使用`saveOrUpdate()`。 就個人而言,我認為這樣做沒有任何危害。 雖然,這可能會讓您有些粗心。 所以要小心。 #### 2.1 Hibernate `saveOrUpdate()`示例 讓我們看看如何將`saveOrUpdate()`方法與`save()`方法持久化的實體一起使用。 ```java public class SaveOrUpdateMethodExample { 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(); Session sessionTwo = HibernateUtil.getSessionFactory().openSession(); sessionTwo.beginTransaction(); emp.setLastName("temp"); //Save employee again second time sessionTwo.saveOrUpdate(emp); sessionTwo.getTransaction().commit(); HibernateUtil.shutdown(); } } ``` 程序輸出: ```java Hibernate: insert into Employee (FIRST_NAME, LAST_NAME, ID) values (?, ?, ?) Hibernate: select employeeen_.ID, employeeen_.FIRST_NAME as FIRST_NA2_1_, employeeen_.LAST_NAME as LAST_NAM3_1_ from Employee employeeen_ where employeeen_.ID=? Hibernate: update Employee set FIRST_NAME=?, LAST_NAME=? where ID=? ``` 現在,我們可以使用`saveOrUpdate()`方法保存實體并更新實體。 請記住,如果您使用了`saveOrUpdate()`方法代替了上面的`save()`方法,那么結果也將是相同的。 `saveOrUpdate()`既可以用于持久實體也可以用于非持久實體。 持久化實體將得到更新,并且瞬態實體將被插入數據庫中。 ## 3\. 關于生產代碼的建議 - 最佳實踐 嘗試在生產代碼中使用上述代碼是不明智的。 理想情況下,您要做的是將 VO 對象傳遞到 DAO 層,從會話中加載實體,并通過將 VO 數據復制到該實體來更新實體。 這意味著更新是在持久對象上進行的,實際上我們根本不必調用`Session.save()`或`Session.saveOrUpdate()`。 一旦對象處于持久狀態,當您更改對象的字段和屬性時,Hibernate 將管理數據庫本身的更新。 真是太好了。 ## 4\. 總結 1. `Save()`方法將對象存儲到數據庫中。 它將堅持給定的瞬時實例,首先分配一個生成的標識符。 它返回創建的實體的 ID。 2. `SaveOrUpdate()`根據標識符是否存在來調用`save()`或`update()`。 例如,如果標識符不存在,則將調用`save()`或將調用`update()`。 3. 由于 Hiberate 管理持久對象中所做的所有更改,因此實際上調用`save()`或`saveOrUpdate()`方法的機會很少。 讓我知道 hibernate `save()`和`saveOrUpdate()`方法相關的問題是否尚不清楚或需要更多說明。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看