使用 JPA 和休眠时如何选择 id 生成策略
我正在浏览Hibernate参考指南的Id生成部分和“Java持久性与Hibernate”
将Hibernate和JPA组合在一起有很多选项。
我正在寻找有关如何选择特定id生成策略的进一步文档。
我也在寻找引爆点。
例如,hilo 策略有望减少争用。我假设必须有与这种选择相关的权衡。
我想接受有关权衡的教育。
有文献吗?
我正在浏览Hibernate参考指南的Id生成部分和“Java持久性与Hibernate”
将Hibernate和JPA组合在一起有很多选项。
我正在寻找有关如何选择特定id生成策略的进一步文档。
我也在寻找引爆点。
例如,hilo 策略有望减少争用。我假设必须有与这种选择相关的权衡。
我想接受有关权衡的教育。
有文献吗?
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)来修复此问题。
基本上,您有两个主要选择:
@GeneratedValue
对于生成的标识符,您有两个选择:
对于数字标识符,您有三个选项:
IDENTITY
当您无法使用(例如MySQL)时,它只是一个不错的选择,因为它禁用了JDBC批量更新。SEQUENCE
SEQUENCE
是首选选项,尤其是与标识符优化器(如 pooled
或 pooled-lo)
一起使用时。
TABLE
是要避免的,因为它使用单独的事务来获取标识符和行级锁,这些锁的扩展性很差。