JPA 主键生成策略

来源:互联网 发布:网红阿沁的淘宝店 编辑:程序博客网 时间:2024/05/16 00:40
JPA 主键生成策略:
JPA 中有四种生成策略,生成规则由@GeneratedValue设定的
@GeneratedValue源码:
@Target({METHOD, FIELD})@Retention(RUNTIME)public @interface GeneratedValue {    GenerationType strategy() default AUTO;/**可选,结合@SequenceGenerator、 @TableGenerator 使用*/    String generator() default "";}package javax.persistence;public enum GenerationType {    TABLE,    SEQUENCE,    IDENTITY,    AUTO}

1、通过容器(程序)自动生成--GenerationType.AUTO

GenerationType.AUTO默认生成策略,由程序控制生成,可省略不写。

2、通过数据库自动增长字段生成,这种情况下需要数据库提供对自增长字段的支持,如SQL Server、MySQL、DB2、Derby等。
@Id@GeneratedValue(strategy= GenerationType.IDENTITY)private long id;
mysql:
id bigint(10) primary key AUTO_INCREMENT not null,
3、通过序列号生成主键,前提是数据库支持序列,如oracle
@Entity// Define a sequence - might also be in another class:@SequenceGenerator(name="seq", initialValue=1, allocationSize=100)public class EntityWithSequenceId {    // Use the sequence that is defined above:    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")    @Id long id;}
4、通过数据库表字段保存主键
将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得,
这种生成主键的方式也是很常用的。这种方法生成主键的策略可以适用于任何的数据库,
不必担心不同数据库不兼容造成的问题。
sql:
CREATE TABLE  tb_generator (    id int(20) NOT NULL auto_increment,    gen_name VARCHAR(255) NOT NULL,    gen_value int(20) NOT NULL,    PRIMARY KEY(id)  )
插入记录,提供生成主键:
INSERT INTO tb_generator(gen_name, gen_value) VALUES ('USER_PK', 1);  
设置主键生成器:
@Id@GeneratedValue(strategy = GenerationType.TABLE,generator="user_gen")@TableGenerator(name = "user_gen",                table="tb_generator",                pkColumnName="gen_name",                valueColumnName="gen_value",                pkColumnValue="USER_PK",                allocationSize=1         )  

TableGenerator源码:
@Target({TYPE, METHOD, FIELD})   @Retention(RUNTIME)  public @interface TableGenerator {    String name();    String table() default "";    String catalog() default "";    String schema() default "";    String pkColumnName() default "";    String valueColumnName() default "";    String pkColumnValue() default "";    int initialValue() default 0;    int allocationSize() default 50;    UniqueConstraint[] uniqueConstraints() default {};  }  
其中属性说明: 
name属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。 
table属性表示表生成策略所持久化的表名,例如,这里表使用的是数据库中的“tb_generator”。 
catalog属性和schema具体指定表所在的目录名或是数据库名。 
pkColumnName属性的值表示在持久化表中,该主键生成策略所对应键值的名称。例如在“tb_generator”中将“gen_name”作为主键的键值 
valueColumnName属性的值表示在持久化表中,该主键当前所生成的值,它的值将会随着每次创建累加。例如,在“tb_generator”中将“gen_value”作为主键的值 
pkColumnValue属性的值表示在持久化表中,该生成策略所对应的主键。例如在“tb_generator”表中,将“gen_name”的值为“USER_PK”。 
initialValue表示主键初识值,默认为0。 
allocationSize表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50。 

UniqueConstraint唯一性约束,只用于表生成的时候。

0 0