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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # `@Immutable`和`@NaturalId` – 特定于 Hiberate 的注解 > 原文: [https://howtodoinjava.com/hibernate/immutable-and-naturalid-hibernate-specific-annotations/](https://howtodoinjava.com/hibernate/immutable-and-naturalid-hibernate-specific-annotations/) 在上一篇文章中,我們了解了[Hiberate](//howtodoinjava.com/hibernate-tutorials/ "Hibernate Tutorials")中最常用的 [JPA 注解](//howtodoinjava.com/hibernate/hibernate-jpa-2-persistence-annotations-tutorial/ "Hibernate / JPA2 Persistence Annotations Tutorial"),還了解了與這些 JPA 注解互補的 Hiberate 注解。 使用 JPA 注解使您的應用代碼可移植到其他 JPA 實現中,這是一件好事。 除了 JPA 注解之外,Hiberate 還具有一些自己的注解,您可以使用它們在應用代碼中具有某些功能。 但是您必須記住,將來的日期可能很難使您的代碼可移植。 > **閱讀更多: [JPA2 持久化注解教程](//howtodoinjava.com/hibernate/hibernate-jpa-2-persistence-annotations-tutorial/ "Hibernate / JPA2 Persistence Annotations Tutorial")** 在本文中,我們將學習兩個特定于 Hibernate 的此類注解。 ## 1)`@Immutable`注解 `@Immutable`注解將一個實體標記為不可變。 這在您的實體表示參考數據的情況下非常有用,例如狀態列表,性別或其他很少突變的數據。 由于狀態之類的東西很少會更改,因此通常有人會通過 SQL 或管理應用手動更新數據。 Hibernate 可以積極地緩存此數據,需要將其考慮在內。 如果參考數據發生變化,則需要確保已通知使用該數據的應用(可以使用`refresh()`方法)或以某種方式重新啟動。 `@Immutable`注解告訴 Hibernate,對不可變實體的任何更新都不應傳遞給數據庫而不會給出任何錯誤。 `@Immutable`也可以放在集合上; 在這種情況下,對集合的更改(添加或刪除)將引發`HibernateException`。 **`EmployeeEntity.java`** ```java import org.hibernate.annotations.Immutable; @Immutable @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; //Setters and Getters } ``` **`ImmutableAnnotationExample.java`** ```java public class ImmutableAnnotationExample { public static void main(String[] args) { setupTestData(); Session sessionOne = HibernateUtil.getSessionFactory().openSession(); sessionOne.beginTransaction(); //Load the employee in another session EmployeeEntity employee = (EmployeeEntity) sessionOne.load(EmployeeEntity.class, 1); //Update the first name employee.setFirstName("Alex"); sessionOne.flush(); sessionOne.close(); Session sessionTwo = HibernateUtil.getSessionFactory().openSession(); sessionTwo.beginTransaction(); //Load the employee in another session EmployeeEntity employeeUpdated = (EmployeeEntity) sessionTwo.load(EmployeeEntity.class, 1); //Verify the first name System.out.println(employeeUpdated.getFirstName()); sessionTwo.flush(); sessionTwo.close(); HibernateUtil.shutdown(); } private static void setupTestData(){ Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); //Create Employee EmployeeEntity emp = new EmployeeEntity(); emp.setEmployeeId(1); emp.setFirstName("Lokesh"); emp.setLastName("Gupta"); session.save(emp); session.getTransaction().commit(); session.close(); } } Output: Hibernate: insert into Employee (FIRST_NAME, LAST_NAME, ID) values (?, ?, ?) 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=? 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=? Lokesh //Value didn't updated in database i.e. immutable ``` ## 2)`@NaturalId`注解 在過去的教程中,我們了解了很多有關`@Id`和`@GeneratedValue`注解以為數據庫中的記錄創建主鍵的知識。 在大多數實際應用中,這些主鍵是“***人工主鍵***”,并且僅在應用運行時內部引用。 但是,還存在“**自然 ID**”的概念,除了人工或復合主鍵之外,它還提供了另一種方便且合乎邏輯的方式來引用實體。 **自然 ID 的示例可能是美國的社會安全號碼或稅號,而印度則是 PAN 號碼。** 實體(是個人或公司)可能具有由 Hibernate 生成的人為主鍵,但也可能具有唯一的稅標識符。 Hibernate 還允許您基于這些自然 ID 搜索和加載實體。 對于自然 ID,有兩種形式的加載機制: 一種使用簡單自然 ID(其中自然 ID 是一個且僅一個字段),另一種使用命名屬性作為復合自然 ID 的一部分。 #### 簡單的自然 ID 示例 ```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; //Natural id can be SSN as well @NaturalId Integer SSN; //Setters and Getters } ``` `SimpleNaturalIdExample.java` ```java public class SimpleNaturalIdExample { public static void main(String[] args) { setupTestData(); Session sessionOne = HibernateUtil.getSessionFactory().openSession(); sessionOne.beginTransaction(); //Load the employee EmployeeEntity employee1 = (EmployeeEntity) sessionOne.load(EmployeeEntity.class, 1); //Just to ensure that employee is loasded from DB System.out.println(employee1.getFirstName()); //Get the employee for natural id i.e. SSN; This does not execute another SQL SELECT as entity is already present in session EmployeeEntity employee2 = (EmployeeEntity) sessionOne.bySimpleNaturalId(EmployeeEntity.class).load(12345); //Verify that employee1 and employee2 refer to same object assert(employee1 == employee2); sessionOne.flush(); sessionOne.close(); System.out.println("===================================="); Session sessionTwo = HibernateUtil.getSessionFactory().openSession(); sessionTwo.beginTransaction(); //Get the employee for natural id i.e. SSN; entity is not present in this session EmployeeEntity employee = (EmployeeEntity) sessionTwo.bySimpleNaturalId(EmployeeEntity.class).load(12345); sessionTwo.flush(); sessionTwo.close(); HibernateUtil.shutdown(); } private static void setupTestData(){ Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); //Create Employee EmployeeEntity emp = new EmployeeEntity(); emp.setEmployeeId(1); emp.setFirstName("Lokesh"); emp.setLastName("Gupta"); emp.setSSN(12345); session.save(emp); session.getTransaction().commit(); session.close(); } } Output: Hibernate: insert into Employee (SSN, FIRST_NAME, LAST_NAME, ID) values (?, ?, ?, ?) Hibernate: select employeeen0_.ID as ID1_1_0_, employeeen0_.SSN as SSN2_1_0_, employeeen0_.FIRST_NAME as FIRST_NA3_1_0_, employeeen0_.LAST_NAME as LAST_NAM4_1_0_ from Employee employeeen0_ where employeeen0_.ID=? Lokesh ==================================== Hibernate: select employeeen_.ID as ID1_1_ from Employee employeeen_ where employeeen_.SSN=? Hibernate: select employeeen0_.ID as ID1_1_0_, employeeen0_.SSN as SSN2_1_0_, employeeen0_.FIRST_NAME as FIRST_NA3_1_0_, employeeen0_.LAST_NAME as LAST_NAM4_1_0_ from Employee employeeen0_ where employeeen0_.ID=? ``` 請密切注意如果會話中不存在實體,并且如果您使用實體的自然 ID 獲取實體,則使用自然 ID 提取第一個主要 ID; 然后使用此主要 ID 提取實體。 **如果會話中已經存在實體,則返回相同實體的引用**,而無需在數據庫中執行其他`SELECT`語句。 #### 復合自然 ID 示例 ```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; //Natural id part 1 @NaturalId Integer seatNumber; //Natural id part 2 @NaturalId String departmentName; //Setters and Getters } ``` `CompositeNaturalIdExample.java` ```java public class CompositeNaturalIdExample { public static void main(String[] args) { setupTestData(); Session sessionOne = HibernateUtil.getSessionFactory().openSession(); sessionOne.beginTransaction(); //Get the employee for natural id i.e. SSN; entity is not present in this session EmployeeEntity employee = (EmployeeEntity) sessionOne.byNaturalId(EmployeeEntity.class) .using("seatNumber", 12345) .using("departmentName", "IT") .load(); System.out.println(employee.getFirstName()); sessionOne.flush(); sessionOne.close(); HibernateUtil.shutdown(); } private static void setupTestData(){ Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); //Create Employee EmployeeEntity emp = new EmployeeEntity(); emp.setEmployeeId(1); emp.setFirstName("Lokesh"); emp.setLastName("Gupta"); emp.setSeatNumber(12345); emp.setDepartmentName("IT"); session.save(emp); session.getTransaction().commit(); session.close(); } } Output: Hibernate: insert into Employee (departmentName, FIRST_NAME, LAST_NAME, seatNumber, ID) values (?, ?, ?, ?, ?) Hibernate: select employeeen_.ID as ID1_1_ from Employee employeeen_ where employeeen_.departmentName=? and employeeen_.seatNumber=? Hibernate: select employeeen0_.ID as ID1_1_0_, employeeen0_.departmentName as departme2_1_0_, employeeen0_.FIRST_NAME as FIRST_NA3_1_0_, employeeen0_.LAST_NAME as LAST_NAM4_1_0_, employeeen0_.seatNumber as seatNumb5_1_0_ from Employee employeeen0_ where employeeen0_.ID=? Lokesh ``` 復合自然 ID 的實體獲取邏輯與簡單自然 ID 相同。 除了使用多個自然鍵而不是一個以外,沒有區別。 這些就是所有這些眾所周知的注解。 繼續在評論中發表您的想法。 **祝您學習愉快!**
                  <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>

                              哎呀哎呀视频在线观看