在教义文档中,他们提到@GeneratedValue
注释存在几种不同的策略:
AUTO
SEQUENCE
TABLE
IDENTITY
UUID
CUSTOM
NONE
有人可以解释一下所有策略之间的差异吗?
查看最新的教义文档
以下是摘要: 可能的生成策略列表:
AUTO(默认):告诉 Doctrine 选择所用数据库平台首选的策略。首选策略是MySQL,SQLite和MsSQL的IDENTITY
,SEQUENCE
Oracle和PostgreSQL的首选策略。此策略提供了完全的可移植性。
序列:告诉教义使用数据库序列进行ID
生成。此策略当前不提供完全可移植性。Oracle、PostgreSql 和 SQL Anywhere 支持序列。
IDENTITY:告诉 Doctrine 在数据库中使用在插入行时生成值的特殊标识列。此策略目前不提供完全可移植性,受以下平台支持:
- MySQL/SQLite/SQL Anywhere =>
AUTO_INCREMENT
- MSSQL =>
IDENTITY
- PostgreSQL =>
SERIAL
表:告诉教义使用单独的表进行ID
生成。此策略提供了完全的可移植性。此策略尚未实施!
NONE:告诉 Doctrine 标识符是由您的代码分配并因此生成的。分配必须在将新实体传递给 EntityManager#persist 之前进行。NONE
与完全放弃@GeneratedValue
相同。
从版本 2.3 开始:
UUID:告诉 Doctrine 使用内置的通用唯一标识符生成器。此策略提供了完全的可移植性。
当然,接受的答案是正确的,但它需要如下小幅更新:
根据文档的注释部分:
此注释是可选的,仅当与@Id结合使用时才有意义。 如果未使用 @Id 指定此注释,则NONE策略将用作默认值。
策略属性是可选的。
根据文档的基本映射部分:
SEQUENCE
: 告诉 Doctrine 使用数据库序列生成 ID。此策略当前不提供完全可移植性。Oracle、PostgreSql和SQL Anywhere支持序列。
IDENTITY
:告诉 Doctrine 在数据库中使用在插入行时生成值的特殊标识列。此策略目前不提供完全可移植性,受以下平台支持:
- MySQL/SQLite/SQL Anywhere(AUTO_INCREMENT)
- MSSQL(IDENTITY)
- PostgreSQL(SERIAL).
反对票
关于某人投的反对票,应该注意的是,SQL Anywhere已被添加,接受的答案需要小幅更新。
从程序员的角度来看,它们都实现了相同的结果:即为主键字段提供一个 UNIQUE 值。 严格来说,还满足另外两个条件,即:密钥也必须是强制性的,而不是空的。
唯一的区别在于提供主键值的内部实现。 此外,还需要考虑性能和数据库兼容性因素。 不同的数据库支持不同的策略。
最容易理解的是SEQUENCE
,这通常也是产生最佳性能优势的一种。 在这里,数据库维护一个内部序列,其 nextval 可通过额外的 SQL 调用访问,如下所示:
SELECT nextval ('hibernate_sequence')
下一个值在每个新行插入期间分配。尽管有额外的 SQL 调用,但对性能的影响可以忽略不计。 使用SEQUENCE
,可以使用@SequenceGenerator
注释指定初始值(默认值为 1)和分配大小(默认值 = 50):
@SequenceGenerator(name="seq", initialValue=1, allocationSize=100)
IDENTITY
策略依赖于数据库生成主键,方法是在表中维护一个附加列,只要插入新行,就会自动生成该列的下一个值。 每个类型层次结构都需要一个单独的标识生成器。
TABLE
策略依赖于单独的表来存储和更新每次新行插入的序列。 它使用悲观锁来维持序列,因此是所有这些选项中最慢的策略。 值得注意的是,可以使用@TableGenerator
注释来指定此策略的生成器名称、表名称和模式:
@TableGenerator(name="book_generator", table="id_generator", schema="bookstore")
使用 UUID 选项,持久性提供程序(例如 Hibernate)生成一个格式为">8dd5f315-9788-4d00-87bb-10eed9eff566">的通用唯一 ID。 要选择此选项,只需在数据类型为 UUID 的字段声明上方应用@GeneratedValue注释;例如:
@Entity
public class UUIDDemo {
@Id
@GeneratedValue
private UUID uuid;
// ...
}
最后,AUTO
策略是默认策略,使用此选项,持久性提供程序为正在使用的数据库选择最佳策略。