Hibernate - ID 生成器



生成器類用於為物件生成 ID,該 ID 將成為資料庫表的 primary key。所有生成器類都實現 **org.hibernate.id.IdentifierGenerator** 介面。可以透過實現上述介面並覆蓋 **generator(SharedSessionContractImplementor sess, Object obj)** 方法來建立自己的生成器類。

檢視下面的 employee.hbm.xml 檔案片段

<hibernate-mapping>  
   <class name="com.mypackage.Employee" table="emp">  
      <id name="id">  
         <generator class="assigned"></generator>  
      </id> 
...
</hibernate-mapping>

生成器類的型別

**Hibernate** 提供了許多預定義的 **生成器** 類。Hibernate 中一些重要的預定義生成器類包括:

  • **assigned** - 此生成器指示應用程式將分配 primary key 值。在這種情況下,Hibernate 不會生成任何值。

  • **identity** - 此生成器使用資料庫的自增功能來生成 primary key 值。它適用於大多數資料庫,並且適用於簡單的用例。Oracle 不支援 identity 生成器。MySQL、MS SQL Server、DB2 等支援此功能。

  • **sequence** - 此生成器使用資料庫序列來生成 primary key 值。在某些情況下,它提供了比 identity 更好的效能和控制。

    建立序列的命令

    create sequence <sequence_name> start with <number> increment by <number>
    

    **注意** - MySQL 不支援序列。Oracle 支援序列。

    employee.hbm.xml 中的條目

    <hibernate-mapping>  
       <class name="com.mypackage.Employee" table="emp">  
          <id name="id">  
             <generator class=”sequence”>
                <param name=”sequence”>datasource_name</param>
             </generator>
          </id> 
    ...
    </hibernate-mapping>
    
  • **increment** - 此生成器透過遞增儲存在記憶體中的值來生成 primary key 值。

  • **hilo** - 此生成器使用高低演算法來生成 primary key 值。它結合了 sequence 和 increment 的優點。

  • **uuid** - 此生成器生成通用唯一識別符號 (UUID) 作為 primary key 值。它適用於需要唯一 ID 的分散式系統。

  • **native** - 此生成器將 primary key 生成策略委託給底層資料庫。如果底層資料庫支援 identity,則選擇 identity。否則,選擇 sequence 或 hilo。它根據資料庫方言選擇最佳策略。

  • **foreign** - 此生成器使用另一個關聯實體的 primary key 值作為當前實體的 primary key 值。

使用註解生成 ID

我們可以使用 IDENTITY 生成器註解來生成 ID 欄位。請參見下面的示例

@Entity
public class Employee {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   // ... other fields
}
廣告