GeneratedValue策略之间的差异

sup*_*ero 44 doctrine-orm

Doctrine文档中,他们提到@GeneratedValue注释存在一些不同的策略:

  • AUTO
  • SEQUENCE
  • TABLE
  • IDENTITY
  • UUID
  • CUSTOM
  • NONE

有人请解释所有人的策略之间的差异吗?

BAD*_*med 76

查看最新的学说文档

以下是摘要:可能的生成策略列表:

AUTO(默认值):告诉Doctrine选择所使用的数据库平台首选的策略.首选策略适用IDENTITY于MySQL,SQLite和MsSQL以及SEQUENCEOracle和PostgreSQL.该策略提供了完全的可移植性.

SEQUENCE:告诉Doctrine使用数据库序列进行ID生成.该策略目前不提供完全的可移植性.Oracle和PostgreSql支持序列.

IDENTITY:告诉Doctrine在数据库中使用特殊标识列,这些列在插入行时生成值.此策略目前不提供完全可移植性,并受以下平台支持:

  • MySQL/SQLite => AUTO_INCREMENT
  • MSSQL => IDENTITY
  • PostgreSQL => SERIAL

表:告诉Doctrine使用单独的表进行ID生成.该策略提供了完全的可移植性.这个策略尚未实施!

NONE:告诉Doctrine标识符由您的代码分配并由此生成.必须在将新实体传递给EntityManager#persist之前进行分配.NONE就像@GeneratedValue完全放弃一样.

自版本2.3:

UUID:告诉Doctrine使用内置的通用唯一标识符生成器.该策略提供了完全的可移植性.

  • 您引用了 2.0 文档,所以我猜现在表格可用了。如果您有任何想法,我仍然想知道 UUID。 (2认同)
  • 有关如何使用“自定义”策略的信息,我刚刚在此处发布了一个示例(http://stackoverflow.com/a/28561017/276382) (2认同)

Pmp*_*mpr 5

当然接受的答案是正确的,但它需要一个小的更新如下:

根据文档的注释部分:

这个注解是可选的只有在与@Id 结合使用时才有意义。如果未使用 @Id 指定此注释,则默认使用NONE策略。

策略属性是可选的

根据文档的基本映射部分:

SEQUENCE:告诉 Doctrine 使用数据库序列来生成 ID。此策略目前不提供完全的可移植性。OraclePostgreSqlSQL Anywhere支持序列。

IDENTITY: 告诉 Doctrine 在数据库中使用特殊的标识列,在插入行时生成一个值。此策略目前不提供完整的可移植性,并受以下平台支持:

  • MySQL / SQLite / SQL Anywhere (AUTO_INCREMENT)
  • MSSQL(身份)
  • PostgreSQL(串行)。

投反对票

关于某人给出的否决票,应注意已添加SQL Anywhere并且接受的答案需要小幅更新

  • 希望我可以在不解释原因的情况下对downvoter的downvoting进行downvote。解释为什么答案是错误的不仅有助于发布答案的人,也有助于整个社区的阅读。一个人不仅可以从好的答案中学习,还可以从其他人的错误中学习。 (9认同)