@GeneratedValue
注解有几种不同的策略:
AUTO
SEQUENCE
TABLE
IDENTITY
UUID
CUSTOM
NONE
请问有人能够解释一下这些策略之间的差异吗?
@GeneratedValue
注解有几种不同的策略:
AUTO
SEQUENCE
TABLE
IDENTITY
UUID
CUSTOM
NONE
请问有人能够解释一下这些策略之间的差异吗?
以下是概要: 可能的生成策略列表:
AUTO(默认):告诉Doctrine选择所使用数据库平台首选的策略。首选策略为MySQL、SQLite和MsSQL的IDENTITY
,以及Oracle和PostgreSQL的SEQUENCE
。此策略提供全面的可移植性。
SEQUENCE:告诉Doctrine使用数据库序列进行ID
生成。该策略目前不能完全可移植。序列受Oracle、PostgreSQL和SQL Anywhere支持。
IDENTITY:告诉Doctrine在数据库中使用特殊的自增列,在插入行时生成值。此策略目前不能完全可移植,并且由以下平台支持:
AUTO_INCREMENT
IDENTITY
SERIAL
TABLE:告诉Doctrine使用单独的表进行ID
生成。此策略提供全面的可移植性。此策略尚未实现!
NONE:告诉Doctrine标识符由您的代码分配和生成。分配必须在将新实体传递给EntityManager#persist之前进行。 NONE
与完全省略@GeneratedValue
相同。
UUID:告诉Doctrine使用内置的通用唯一标识符生成器。此策略提供全面的可移植性。
当然,被接受的答案是正确的,但它需要进行以下更新:
根据文档的注释部分:
此注释是可选的,仅在与@Id一起使用时才有意义。如果没有使用@Id指定此注释,则默认使用NONE策略。
strategy属性是可选的。
根据文档的基本映射部分:
SEQUENCE
:告诉Doctrine使用数据库序列进行ID生成。该策略目前不能提供完全的可移植性。序列由Oracle、PostgreSql和SQL Anywhere支持。
IDENTITY
:告诉Doctrine在数据库中使用特殊的身份列,在插入行时生成一个值。该策略目前不能提供完全的可移植性,以下平台支持此策略:
- MySQL/SQLite/SQL Anywhere(AUTO_INCREMENT)
- MSSQL(IDENTITY)
- PostgreSQL(SERIAL)。
关于某人给出的负评,应注意到SQL Anywhere已被添加,接受的答案需要进行微小的更新。
SELECT nextval ('hibernate_sequence')
SEQUENCE
,可以使用 @SequenceGenerator
注释指定初始值(默认为 1)和分配大小(默认为 50):@SequenceGenerator(name="seq", initialValue=1, allocationSize=100)
@TableGenerator(name="book_generator", table="id_generator", schema="bookstore")
使用UUID选项,持久性提供程序(例如Hibernate)生成形式为:'8dd5f315-9788-4d00-87bb-10eed9eff566'的通用唯一标识符。要选择此选项,只需在数据类型为UUID的字段声明上方应用@GeneratedValue注释即可,例如:
@Entity
public class UUIDDemo {
@Id
@GeneratedValue
private UUID uuid;
// ...
}
最后,AUTO
策略是默认选项,使用此选项时,持久化提供程序会为所使用的数据库选择最优策略。