GeneratedValue策略之间的差异
在Doctrine文档中,他们提到@GeneratedValue
注释存在一些不同的策略:
-
AUTO
-
SEQUENCE
-
TABLE
-
IDENTITY
-
UUID
-
CUSTOM
-
NONE
请有人解释所有的战略之间的差异?
检查最新的学说文件
这里是一个总结:可能的生成策略列表:
AUTO(默认值) :指示Doctrineselect使用的数据库平台所偏好的策略。 首选的策略是MySQL,SQLite和MsSQL的IDENTITY
和Oracle和PostgreSQL的SEQUENCE
。 这个策略提供了完全的便携性。
SEQUENCE:指示Doctrine使用数据库序列进行ID
生成。 这个策略目前不提供完全的可移植性。 Oracle和PostgreSQL支持序列。
IDENTITY:告诉Doctrine在数据库中使用特殊标识列,在插入行时生成一个值。 这个策略目前不提供完全的可移植性,并且受以下平台支持:
- MySQL / SQLite =>
AUTO_INCREMENT
- MSSQL =>
IDENTITY
- PostgreSQL =>
SERIAL
表:指示Doctrine使用单独的表来生成ID
。 这个策略提供了完全的便携性。 这个策略还没有实施!
无:告诉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)。
Downvote
关于由某人给出的downvote,应该注意的是SQL Anywhere已经被添加,并且接受的答案需要一个小的更新 。