主键生成器表介绍
本篇介绍JPA规范下的主键生成器表,相关主键生成策略可查看 JPA主键生成策略介绍。
1. 表结构
MySQL 下的 flea_id_generator 表结构:
字段 | 名称 | 类型 | 长度 |
---|---|---|---|
id_generator_key | ID生成器的键【即主键生成策略的键值名称】 | varchar | 50 |
id_generator_value | ID生成器的值【即主键生成的值】 | bigint | 20 |
2. 使用
在笔者的 JPA主键生成策略介绍 也已经介绍了 JPA 规范的 @TableGenerator
注解 的相关内容。
值得关注的是,上述主键生成器表的字段,对应着 @TableGenerator
注解中的 pkColumnName 和 valueColumnName 两个属性;主键生成器表的表名,对应着 @TableGenerator
注解中的 table 属性。
@TableGenerator
注解中的 pkColumnValue 属性,对应主键生成器表中 id_generator_key 字段的数据值。
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ORDER_GENERATOR")
@TableGenerator(
// 唯一的生成器名称,可以由一个或多个类引用以作为id值的生成器。
name = "ORDER_GENERATOR",
// 存储生成的ID值的表的名称
table = "flea_id_generator",
// 表中主键列的名称
pkColumnName = "id_generator_key",
// 存储最后生成的主键值的列的名称
valueColumnName = "id_generator_value",
// ID生成器表中的主键值模板,用于将该生成值集与其他可能存储在表中的值区分开
pkColumnValue = "pk_order",
// 从ID生成器表中分配ID号时增加的数量
allocationSize = 1
)
@Column(name = "order_id", unique = true, nullable = false)
private Long orderId; // 订单编号
如果存在分表场景,也可以设置分表的主键值模板,如下面的 pkColumnValue 属性;这里的 pk_order_(ORDER_ID)
中的 (ORDER_ID)
需要 分表配置 对应上。
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ORDER_GENERATOR")
@TableGenerator(
// 唯一的生成器名称,可以由一个或多个类引用以作为id值的生成器。
name = "ORDER_GENERATOR",
// 存储生成的ID值的表的名称
table = "flea_id_generator",
// 表中主键列的名称
pkColumnName = "id_generator_key",
// 存储最后生成的主键值的列的名称
valueColumnName = "id_generator_value",
// ID生成器表中的主键值模板,用于将该生成值集与其他可能存储在表中的值区分开
pkColumnValue = "pk_order_(ORDER_ID)",
// 从ID生成器表中分配ID号时增加的数量
allocationSize = 1
)
@Column(name = "order_id", unique = true, nullable = false)
private Long orderId; // 订单编号
<!-- 定义分表配置
name : 分表对应的主表名
lib : 分表对应模板库名
exp : 分表名表达式 (FLEA_TABLE_NAME)_(列名大写)_(列名大写)
-->
<table name="order" lib="fleaorder" exp="(FLEA_TABLE_NAME)_(ORDER_ID)" desc="Flea订单信息表分表规则">
<splits>
<!-- 定义分表转换实现
key : 分表转换类型关键字【可查看 TableSplitEnum】
column : 分表属性列字段名
seq : 分库序列键【若不为空,值需对应flea-lib-split.xml中<split seq="SEQ" />】
implClass : 分表转换实现类【可自行定义,需实现com.huazie.frame.db.com.huazie.frame.db.common.table.split.ITableSplit】
注意:
(1)key不为空,implClass可不填
(2)key为空,implClass必填
(3)key 和 implClass 都不为空,implClass需要和分表转换类型枚举中分表转换实现类对应上
-->
<split key="ONE" column="order_id" seq="SEQ" />
</splits>
</table>
如果存在分库场景,默认主键生成器表在模板库中;当然也可以让主键生成器表存放在每个分库之中,这个时候就需要使用 @FleaTableGenerator
注解 ,设置生成器标识 generatorFlag 为 false,如下所示:
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ORDER_GENERATOR")
@TableGenerator(
// 唯一的生成器名称,可以由一个或多个类引用以作为id值的生成器。
name = "ORDER_GENERATOR",
// 存储生成的ID值的表的名称
table = "flea_id_generator",
// 表中主键列的名称
pkColumnName = "id_generator_key",
// 存储最后生成的主键值的列的名称
valueColumnName = "id_generator_value",
// ID生成器表中的主键值模板,用于将该生成值集与其他可能存储在表中的值区分开
pkColumnValue = "pk_order_(ORDER_ID)",
// 从ID生成器表中分配ID号时增加的数量
allocationSize = 1
)
@FleaTableGenerator(generatorFlag = false)
@Column(name = "order_id", unique = true, nullable = false)
private Long orderId; // 订单编号