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文档

  • 相关阅读:
    原生js ajax与jquery ajax的区别
    ajax的五大步骤
    js中setTimeout()时间参数设置为0的探讨
    js数组与字符串的相互转换方法
    javascript的三个组成部分
    linq 获取不重复数据,重复数据 var unique = arr.GroupBy(o => o).Where(g => g.Count() == 1) .Select(g => g.ElementAt(0));
    C# 随机 抽奖 50个随机码 不重复
    聚集索引和非聚集索引 聚集索引的叶节点就是最终的数据节点,而非聚集索引的叶节仍然是索引节点,但它有一个指向最终数据的指针。
    WPF ControlTemplate,DataTemplate
    C# 实现 奇数偶数排序,奇数在前,偶数在后
  • 原文地址:https://www.cnblogs.com/jj81/p/13580384.html
Copyright © 2011-2022 走看看