<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之旅 廣告
                # Hiberate 實體等價和等同 > 原文: [https://howtodoinjava.com/hibernate/hibernate-entities-equality-and-identity/](https://howtodoinjava.com/hibernate/hibernate-entities-equality-and-identity/) 在我們的應用中,很多時候我們都面臨著這樣的情況,我們必須比較兩個對象以檢查它們的相等性以滿足某些業務規則。 在核心 Java 中,我們已經掌握了檢查對象是否相等的知識,但是在 Hiberate 下,我們還需要注意一些額外的事情。 讓我們了解一下那些額外的概念。 我們已經了解了 Hiberate 實體在其生命周期中的各種[**狀態**](//howtodoinjava.com/hibernate/hibernate-entity-persistence-lifecycle-states/ "Hibernate Entity / Persistence LifeCycle States")。 在那里,我們討論了 Hiberate 大多數僅適用于持久對象。 眾所周知,當我們在 hibernate 中有一個持久對象時,該對象代表了兩個: * 特定 Java 虛擬機(JVM)中類的實例 * 數據庫表中的一行(或多行) 我們對第一個概念了解足夠。 我將集中討論第二點。 ## 從同一會話中獲取的對象 從同一 Hibernate 會話再次請求持久對象**會返回類**的相同 Java 實例,這意味著您可以使用標準 Java `==`等式語法比較這些對象。 讓我們看一個簡單的例子: ```java public static void main(String[] args) { Session sessionOne = HibernateUtil.getSessionFactory().openSession(); sessionOne.beginTransaction(); // Create new Employee object EmployeeEntity emp = new EmployeeEntity(); emp.setFirstName("Lokesh"); emp.setLastName("Gupta"); //Save employee sessionOne.save(emp); sessionOne.getTransaction().commit(); //Get employee id Integer genEmpId = emp.getEmployeeId(); //New session where we will fetch the employee two times and compare the objects Session sessionTwo = HibernateUtil.getSessionFactory().openSession(); sessionTwo.beginTransaction(); EmployeeEntity employeeObj1 = (EmployeeEntity) sessionTwo.get(EmployeeEntity.class, genEmpId); EmployeeEntity employeeObj2 = (EmployeeEntity) sessionTwo.get(EmployeeEntity.class, genEmpId); //Checking equality System.out.println(employeeObj1 == employeeObj2); HibernateUtil.shutdown(); } Output: true ``` 您可以在上面看到,我們在`EmployeeEntity`上有兩個實例,并且它們實際上都是同一個 Java 對象實例。 ## 從不同會話中獲取的對象 如果您從多個會話中向**請求一個持久對象**,則 Hibernate 將為每個會話提供不同的實例,如果您比較這些對象實例,則`==`運算符將返回`false`。 讓我們比較上面示例中的實例“`emp`”和“`employeeObj1`”,結果將為假; 因為兩者都是在單獨的會話中獲取的。 ```java System.out.println(emp == employeeObj1); System.out.println(emp.equals(employeeObj1)); Output: false false ``` 因此,如果要在兩個不同的會話中比較對象,則需要在 Java 持久化對象上實現`equals()`方法,無論如何,您都應該經常執行此方法。 (請不要忘記將`hashCode()`與它一起覆蓋。) > **閱讀更多信息**:[覆蓋`hashCode()`和`equals()`方法](//howtodoinjava.com/java/related-concepts/working-with-hashcode-and-equals-methods-in-java/ "Working with hashCode and equals methods in java") Hibernate 將實際對象包裝在代理中,因此請始終在內部使用設置器方法而不是實際屬性進行比較。 現在,根據建議添加`equals()`方法,然后在檢查`EmployeeEntity`上兩個實例的相等性時查看行為更改。 ```java @Entity @Table(name = "Employee") public class EmployeeEntity implements Serializable { private static final long serialVersionUID = -1798070786993154676L; @Id @Column(name = "ID", unique = true, nullable = false) @GeneratedValue(strategy = GenerationType.SEQUENCE) 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; } //Setters and Getters } ``` 現在,使用`equals()`方法再次檢查是否相等。 (`==`將返回`false`,我們知道)。 ```java System.out.println(emp.equals(employeeObj1)); Output: true ``` 現在,兩個對象在邏輯上和程序上都是相等的。 ## 項目要點 1. 從相同的 Hibernate 會話再次請求持久對象將返回類的“相同 Java 實例”。 2. 從不同的 Hibernate 會話中請求一個持久對象,將返回一個類的“不同的 Java 實例”。 3. 最佳實踐是,始終在 Hiberate 實體中實現[`equals()`和`hashCode()`](//howtodoinjava.com/java/related-concepts/working-with-hashcode-and-equals-methods-in-java/ "Working with hashCode and equals methods in java")方法; 并始終僅使用`equals()`方法進行比較。 **祝您學習愉快!**
                  <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>

                              哎呀哎呀视频在线观看