@GeneratedValue`
JPA的@GeneratedValue
注解,在JPA中,@GeneratedValue
注解存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键),@GeneratedValue
提供了主键的生成策略。
@GeneratedValue
注解有两个属性,分别是strategy
和generator
,其中generator
属性的值是一个字符串,默认为""
,其声明了主键生成器的名称(对应于同名的主键生成器@SequenceGenerator
或@TableGenerator
)。
@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface GeneratedValue {
GenerationType strategy() default AUTO;
String generator() default "";
}
其中GenerationType :
public enum GenerationType {
//使用一个特定的数据库表格来保存主键。
TABLE,
//根据底层数据库的序列来生成主键,条件是数据库支持序列。
SEQUENCE,
//主键由数据库自动生成(主要是自动增长型)
IDENTITY,
//主键由程序控制。
AUTO
}
如果实体类表示的自动生成策略是 GenerationType.SEQUENCE
,需要和@SequenceGenerator
配合使用
@Repeatable(SequenceGenerators.class)
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface SequenceGenerator {
//必填,主键生成器的名称,和@GeneratedValue的generator 属性所使用的,值必须保持一致
String name();
//数据库序列对象名称
String sequenceName() default "";
//序列生成器目录
String catalog() default "";
//序列生成器框架
String schema() default "";
//序列初始值
int initialValue() default 1;
//预先分配序列号的数目
int allocationSize() default 50;
}
如果实体标识的自动生策略是 GenerationType.TABLE
,需要和@TableGenerator
配合使用
@Repeatable(TableGenerators.class)
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface TableGenerator {
//必填,主键生成器的名称,和@GeneratedValue的generator 属性所使用的,值必须保持一致
String name();
//表的名称
String table() default "";
//表的目录
String catalog() default "";
//表的架构
String schema() default "";
//主键字段的名称
String pkColumnName() default "";
//最后生成的值的列的名称。
String valueColumnName() default "";
//表中的主键字段的特征字符串值
String pkColumnValue() default "";
//ID的初始值
int initialValue() default 0;
//预先分配ID的数目
int allocationSize() default 50;
//表的唯一约束,除主键以外的其他的约束
UniqueConstraint[] uniqueConstraints() default {};
//表的索引,主键不需要指定,主键自动创建
Index[] indexes() default {};
}