主键生成器

最后更新:2023-09-29 23:16:44 | 状态:未完成
默认情况下AnyLine不处理主键,一般是由数据库自动生成。

但是主键会影响AnylineService.save()的执行,有主键值的情况下:save()会执行update sql,如果没有主键值情况下:save()会执行insert sql

如果需要在Java中生成主键,可以通过以下几种方式实现。这样在save()时不会因为有主键值而执行update sql
在insert之前会生成主键并赋值给entity或DataRow,所以在执行完insert之后可以直接getId获取生成的主键值。

  1. 通过设置几个主键生成器的开关,有以下几个属性可以设置,但只能打开一个,打开多个也只会有一个生效(以下代码双击可对齐)
    //通过ConfigTablec静态属性
    PRIMARY_GENERATOR_UUID_ACTIVE               = false			;	// 是否开启默认的主键生成器(UUID)
    PRIMARY_GENERATOR_SNOWFLAKE_ACTIVE          = false			;	// 是否开启默认的主键生成器(雪花)
    PRIMARY_GENERATOR_RANDOM_ACTIVE	            = false			;	// 是否开启默认的主键生成器(随机)
    PRIMARY_GENERATOR_TIMESTAMP_ACTIVE          = false			;	// 是否开启默认的主键生成器(时间戳)
    PRIMARY_GENERATOR_TIME_ACTIVE               = false			;	// 是否开启默认的主键生成器(年月日时分秒毫秒)
    //影响主键生成的几个参数
    PRIMARY_GENERATOR_WORKER_ID                 = 1				;	// 主键生成器机器ID
    PRIMARY_GENERATOR_PREFIX                    = ""			;	// 主键前缀(随机主键)
    PRIMARY_GENERATOR_RANDOM_LENGTH             = 32			;	// 主随机主键总长度
    PRIMARY_GENERATOR_UPPER                     = true			;	// 生成主键大写
    PRIMARY_GENERATOR_LOWER                     = false			;	// 生成主键小写
    PRIMARY_GENERATOR_TIME_FORMAT               = null			;	// 生成主键日期格式(默认yyyyMMddHHmmssSSS)
    PRIMARY_GENERATOR_TIME_SUFFIX_LENGTH        = 3				;   // 生成主键TIME/TIMESTAMP后缀随机数长度
    SNOWFLAKE_TWEPOCH                           = "2000-01-01"	;	// 雪花算法开始日期
    
    
    
  2. spring配置文件
    //通过spring配置文件(yml或properties)设置开关状态(与ConfigTable静态属性一一对应)
    anyline.primary-generator-uuid-active=false
    anyline.primary-generator-snowflake-active=false
    anyline.primary-generator-random-active=false
    anyline.primary-generator-timestamp-active=false
    anyline.primary-generator-time-active=false
    或
    anyline.generator=枚举值(time,snowflake,timestamp,random,uuid)
    
  3. 如果以上几开关够不适,用可以针对单个表设置具体主键生成器实例
    3.1
     ConfigTable.GENERATOR.set(PrimaryGenerator.枚举值或自己实现PrimaryGenerator)设置全局主键生成器,对所有表有效
    ConfigTable.GENERATOR.set(表名,PrimaryGenerator.枚举值或自己实现PrimaryGenerator) 针对单个表有效,覆盖全局配置
    3.2
    GeneratorConfig.put(PrimaryGenerator.枚举值或自己实现PrimaryGenerator)设置全局主键生成器,对所有表有效
    GeneratorConfig.put(表名,PrimaryGenerator.枚举值或自己实现PrimaryGenerator) 针对单个表有效,覆盖全局配置
    3.3
    #针对单个表有效,覆盖全局配置
    anyline.generators.crm_user=uuid
    3.4
    JPA注解,如
    @GeneratedValue(generator = "snowflake")
    private Long id;

  4. 实现PrimaryGenerator注入到spring容器中,实现方式参考PrimaryGenerator提供的几个枚举
  5. 针对Entity(不包括DataRow)可以实现EntityAdapter.createPrimaryValue(Object obj, List inserts)接口
    参考DefaultEntityAdapter,因为EntityAdapter需要实现的方法比较多,如果只是生成主键,不推荐EntityAdapter
  6. 如果有哪个表不需要生成主键,
    可以通过anyline.generators.hr_department=disable覆盖全局配置
    或ConfigTable.GENERATOR.set("hr_department",PrimaryGenerator.DISABLE)

为什么配置文件里提示的枚举变小写了,而在Java中是大写?
因为spring插件的原因。会把属性转小写加中划线,在配置文件中按提示写就可以

关于优先级与覆盖
后写的覆盖先写的,单个表的覆盖全局的,注解覆盖配置文件。
如果写在java里注意看是在spring上下文环境加载前还是加载后。如果是在加载后则Java覆盖配置文件。

最近更新 搜索 提交