GeneratedValue策略之间的差异

时间:2012-12-24 14:05:10

标签: doctrine-orm

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

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

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

3 个答案:

答案 0 :(得分:76)

检查latest doctrine documentation

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

AUTO(默认):告诉Doctrine选择所使用的数据库平台首选的策略。对于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使用内置的通用唯一标识符生成器。该策略提供了完全的可移植性。

答案 1 :(得分:2)

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

根据documentation注释部分:

  

此注释为可选仅在与@Id一起使用时才有意义。   如果未使用@Id指定此注释,则 NONE 策略将用作默认值。

     

策略属性为可选

根据documentation基本映射部分:

  

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

     

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

     
      
  • MySQL / SQLite / SQL Anywhere (AUTO_INCREMENT)
  •   
  • MSSQL (IDENTITY)
  •   
  • PostgreSQL (SERIAL)。
  •   

Downvote

关于某人给出的downvote,应该注意已添加 SQL Anywhere ,并且接受的答案需要次要更新

答案 2 :(得分:0)

从程序员的角度来看,它们都达到相同的结果:即为主键字段提供UNIQUE值。严格来说,还满足另外两个条件,即:密钥也必须是强制性的,并且 not null

唯一的区别在于提供主键值的内部实现。此外,还需要考虑性能和数据库兼容性因素。不同的数据库支持不同的策略。

最容易理解的是SEQUENCE,通常这也是产生最佳性能优势的一种。在这里,数据库维护一个内部序列,其下一个val可通过其他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)将生成以下形式的通用唯一ID:'8dd5f315-9788-4d00-87bb-10eed9eff566'。要选择此选项,只需在数据类型为UUID的字段声明上方应用@GeneratedValue批注;例如:

@Entity
public class UUIDDemo {

    @Id
    @GeneratedValue
    private UUID uuid;

    // ...
}

最后,AUTO策略是默认策略,并且使用此选项,持久性提供程序为正在使用的数据库选择最佳策略。