SpringBoot | Jpa @Id @GeneratedValue
@Id
代码实现
@Id 用于声明一个实体类的属性映射为数据库的主键列。
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Id {
}
@GeneratedValue
@GeneratedValue注解提供主键值的生成策略的规范,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer对应identity,MySQL 对应 auto increment。
代码实现
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface GeneratedValue {
GenerationType strategy() default GenerationType.AUTO;
String generator() default "";
}
public enum GenerationType {
TABLE,
SEQUENCE,
IDENTITY,
AUTO;
private GenerationType() {
}
}
TABLE
使用一个特定的数据库表格来保存主键。
源码:
@Repeatable(TableGenerators.class)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TableGenerator {
String name(); //表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中
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; //表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50
UniqueConstraint[] uniqueConstraints() default {}; //Unique constraints that are to be placed on the table.
Index[] indexes() default {}; //Indexes for the table
}
使用:
@TableGenerator(
name = "useSysTableGenerator",
table = "ID_GEN",
pkColumnName="GEN_KEY",
valueColumnName="GEN_VALUE",
pkColumnValue="USER_ID",
initialValue = 10,
allocationSize=1
)
@Id
@GeneratedValue(strategy = TABLE,generator = "useSysTableGenerator")
@Column(name = "id",insertable = false,updatable = false)
private Long id;
在使用Mysql+JPA中需要在 IDENTITY 和 TABLE 之间进行选择。考虑到 TABLE 策略的性能和可扩展性问题,答案显而易见。
SEQUENCE
根据底层数据库的序列来生成主键,条件是数据库支持序列,因为sequence 生成标识符的机制依赖于底层数据库系统的序列, 因此, 要求底层数据库系统必须支持序列. 支持序列的数据库包括: DB2, Oracle。而常用的Mysql不支持。
源码:
@Repeatable(SequenceGenerators.class)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SequenceGenerator {
String name(); //属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。
String sequenceName() default ""; //属性表示生成策略用到的数据库序列名称
String catalog() default ""; //序列生成器的目录
String schema() default ""; //序列生成器的模式
int initialValue() default 1; //表示主键初识值,默认为1
int allocationSize() default 50;//表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50。
}
序列生成器可以在实体类或主键字段或属性上指定。生成器名称的作用域对于持久性单元是全局的(跨所有生成器类型)。
使用:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "sys_user_sequence")
@SequenceGenerator(name = "sys_user_sequence",sequenceName = "sys_user_sequence",initialValue = 10,allocationSize = 12)
@Column(name = "user_id",insertable = false,updatable = false)
private Long id;
IDENTITYIDENTITY
主键由数据库自动生成(主要是自动增长型),由数据库自动维护
使用:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY )
@Column(name = "user_id",insertable = false,updatable = false)
private Long id;