JPA 主键生成策略:
JPA 中有四种生成策略,生成规则由@GeneratedValue设定的
@GeneratedValue源码:
1、通过容器(程序)自动生成--GenerationType.AUTO
将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得,
这种生成主键的方式也是很常用的。这种方法生成主键的策略可以适用于任何的数据库,
不必担心不同数据库不兼容造成的问题。
sql:
TableGenerator源码:
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。
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唯一性约束,只用于表生成的时候。