zoukankan      html  css  js  c++  java
  • 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文档

  • 相关阅读:
    MyBatis的Mapper接口以及Example的实例函数及详解
    数据存储
    广播
    java线程复习3(线程的中断)
    java线程复习2(获取和设置线程信息)
    java线程复习1(线程创建)
    最好的启动方式
    工厂模式
    欧几里得算法
    组合数打表
  • 原文地址:https://www.cnblogs.com/jj81/p/13580384.html
Copyright © 2011-2022 走看看