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
}
广告