Hibernate 简明教程

Hibernate - ID Generator

生成器类用于为对象生成一个 ID,该 ID 将成为数据库表的的主键。所有生成器类都实现 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>

Types of Generator Classes

Hibernate 提供了许多预定义的 generator 类。Hibernate 中一些重要的预定义生成器类为:

  1. assigned − 此生成器表示应用程序将分配主键值。此情况下,Hibernate 不会生成任何值。

  2. identity − 此生成器使用数据库的自动增量特性来生成主键值。它适用于大多数数据库并且适合于简单用例。Oracle 不支持身份生成器。MySQL、MS SQL Server、DB2 等支持此生成器。

  3. sequence − 此生成器使用数据库序列来生成主键值。在某些情况下,它与身份相比提供了更好的性能和控制从创建序列的命令create sequence <sequence_name> start with <number> increment by <number> Note − 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>

  1. increment − 此生成器通过增量存储在内存中的值来生成主键值。

  2. hilo − 此生成器使用高级低级算法来生成主键值。它结合了序列和增量的优点。

  3. uuid − 此生成器生成通用唯一识别符 (UUID) 作为主键值。它适用于需要唯一 ID 分布式系统。

  4. native − 此生成器将主键生成策略委派给底层数据库。如果底层数据库支持标识,它便选择标识。否则,它便选择序列或 hilo。它根据数据库方言选择最佳的策略。

  5. foreign − 此生成器使用另一个关联实体里的主键值作为当前实体的主键值。

Generating ID using Annotations

我们可以使用 IDENTITY 生成器注释来生成 ID 字段。请参见以下示例:

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

   // ... other fields
}