使用 JPA 和休眠时如何选择 id 生成策略

我正在浏览Hibernate参考指南的Id生成部分和“Java持久性与Hibernate”

将Hibernate和JPA组合在一起有很多选项。

我正在寻找有关如何选择特定id生成策略的进一步文档。

我也在寻找引爆点。

例如,hilo 策略有望减少争用。我假设必须有与这种选择相关的权衡。

我想接受有关权衡的教育。

有文献吗?


答案 1

API文档对此非常清楚。

所有生成器都实现了接口 org.hibernate.id.IdentifierGenerator。这是一个非常简单的界面。一些应用程序可以选择提供自己的专用实现,但是,Hibernate提供了一系列内置实现。内置生成器的快捷方式名称如下:

增加

生成 long、short 或 int 类型的标识符,这些标识符仅在没有其他进程将数据插入同一表中时才是唯一的。不要在群集中使用。

身份

支持 DB2、MySQL、MS SQL Server、Sybase 和 HypersonicSQL 中的标识列。返回的标识符的类型为 long、short 或 int。

序列

在 DB2、PostgreSQL、Oracle、SAP DB、McKoi 中使用序列,或在 Interbase 中使用生成器。返回的标识符的类型为 long、short 或 int

希洛

使用 hi/lo 算法有效地生成 long、short 或 int 类型的标识符,给定表和列(默认情况下分别hibernate_unique_key和next_hi)作为 hi 值的源。hi/lo 算法生成仅对特定数据库唯一的标识符。

塞奇洛

使用 hi/lo 算法在给定命名数据库序列的情况下,有效地生成长、短或 int 类型的标识符。

uuid

使用 128 位 UUID 算法生成在网络中唯一的字符串类型的标识符(使用 IP 地址)。UUID 编码为长度为 32 个十六进制数字的字符串。

咕噜咕噜

在 MS SQL Server 和 MySQL 上使用数据库生成的 GUID 字符串。

本地

根据基础数据库的功能选择标识、序列或 hilo。

分配

允许应用程序在调用 save() 之前为对象分配一个标识符。如果未指定任何元素,则这是默认策略。

选择

检索由数据库触发器分配的主键,方法是按某个唯一键选择行并检索主键值。

外国

使用另一个关联对象的标识符。它通常与主键关联结合使用。

序列标识

一种专门的序列生成策略,它利用数据库序列进行实际值生成,但将其与 JDBC3 getGeneratedKeys 结合使用,以返回生成的标识符值作为 insert 语句执行的一部分。此策略仅在面向 JDK 1.4 的 Oracle 10g 驱动程序上受支持。由于 Oracle 驱动程序中的错误,对这些插入语句的注释被禁用。

如果要构建一个没有太多并发用户的简单应用程序,则可以选择增量、标识、hilo 等。这些配置简单,不需要在数据库内部进行太多编码。

应根据数据库选择顺序guid。这些是安全和更好的,因为生成将在数据库内发生。id

更新:最近我们遇到了一个idendity问题,其中基元类型(int)通过使用warapper类型(Integer)来修复此问题。


答案 2

基本上,您有两个主要选择:

  • 您可以自己生成标识符,在这种情况下,您可以使用分配的标识符。
  • 您可以使用注释,Hibernate 将为您分配标识符。@GeneratedValue

对于生成的标识符,您有两个选择:

  • UUID 标识符。
  • 数字标识符。

对于数字标识符,您有三个选项:

IDENTITY当您无法使用(例如MySQL)时,它只是一个不错的选择,因为它禁用了JDBC批量更新。SEQUENCE

SEQUENCE是首选选项,尤其是与标识符优化器(如 pooled pooled-lo)一起使用时。

TABLE是要避免的,因为它使用单独的事务来获取标识符和行级锁,这些锁的扩展性很差。


推荐