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;      

Java8文档

posted @ 2020-08-29 17:19  听说这是最长的名字了  阅读(528)  评论(0编辑  收藏  举报