主键生成器
最后更新:2024-08-13 15:56:03
|
状态:未完成
默认情况下AnyLine不处理主键,一般是由数据库自动生成。
但是主键会影响AnylineService.save()的执行,有主键值的情况下:save()会执行update sql,如果没有主键值情况下:save()会执行insert sql
如果需要在Java中生成主键,可以通过以下几种方式实现。这样在save()时不会因为有主键值而执行update sql
在insert之前会生成主键并赋值给entity或DataRow,所以在执行完insert之后可以直接getId获取生成的主键值。
-
通过设置几个主键生成器的开关,有以下几个属性可以设置,但只能打开一个,打开多个也只会有一个生效(以下代码双击可对齐)
//通过ConfigTable静态属性 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" ; // 雪花算法开始日期
-
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.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;
- 实现PrimaryGenerator注入到spring容器中,实现方式参考PrimaryGenerator提供的几个枚举
-
针对Entity(不包括DataRow)可以实现EntityAdapter.createPrimaryValue(Object obj, List
inserts)接口
参考DefaultEntityAdapter,因为EntityAdapter需要实现的方法比较多,如果只是生成主键,不推荐EntityAdapter -
如果有哪个表不需要生成主键,
可以通过anyline.generators.hr_department=disable覆盖全局配置
或ConfigTable.GENERATOR.set("hr_department",PrimaryGenerator.DISABLE)
为什么配置文件里提示的枚举变小写了,而在Java中是大写?
因为spring插件的原因。会把属性转小写加中划线,在配置文件中按提示写就可以
关于优先级与覆盖
后写的覆盖先写的,单个表的覆盖全局的,注解覆盖配置文件。
如果写在java里注意看是在spring上下文环境加载前还是加载后。如果是在加载后则Java覆盖配置文件。