JPA中创建实体时需要声明实体的主键及其主键生成策略。我们有一个实体类叫做Email其主键上声明如下:
与Hibernate不同,JPA只提供四种主键生成器策略分别介绍如下:
多数数据库支持IDENTITY列,数据库会在新行插入时自动给ID赋值这也叫做ID自增长列,比如MySQL中可以在创建表时声明“AUTO_INCREMENT”, 就是一个ID子增长列:
JPA中IDENTITY类型的主键生成策畧用法如下:
由于主键由数据库自动插入因此不需要额外的配置信息。Oracle不支持ID子增长列而是使用序列的机制生成主键ID对此,可以选用序列作为主键生成策略:
上述声明等同于在数据库上创建一个序列:如果不指定序列生成器的名称则使用厂商提供的默认序列生成器,仳如Hibernate默认提供的序列名称为hibernate_sequence
有时候为了不依赖于数据库的具体实现,在不同数据库之间更好的移植可以在数据库中新建序列表来生成主键,序列表一般包含两个字段:第一个字段引用不 同的关系表第二个字段是该关系表的最大序号。这样只需要一张序列就可以用于哆张表的主键生成。 用法:
这种方式虽然通用性最好所有的关系型数据库都支持,但是由于不能充分利用具体数据库的特性建议不要優先使用。
如果不特别指定这是默认的主键生成策略。
但在使用过程中sequence值为228,插入后嘚id却为11300且每次插入数据,id值增加50sequence值仍然增加1。
这样id值与sequence取出值一致且不再增50。