引言
本篇介绍JPA规范下的主键生成器表,相关主键生成策略可查看 JPA主键生成策略介绍。
1. 主键生成器表
MySQL 下的 flea_id_generator 表结构:
字段 |
名称 |
类型 |
长度 |
id_generator_key |
ID生成器的键【即主键生成策略的键值名称】 |
varchar |
50 |
id_generator_value |
ID生成器的值【即主键生成的值】 |
bigint |
20 |
相关 SQL 如下:
1 2 3 4 5 6 7
| CREATE TABLE `flea_id_generator` ( `id_generator_key` varchar(50) NOT NULL COMMENT 'ID产生器的键【即主键生成策略的键值名称】', `id_generator_value` bigint(20) NOT NULL COMMENT 'ID产生器的值【即主键生成的值】', UNIQUE KEY `UNIQUE_KEY` (`id_generator_key`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `flea_id_generator` VALUES ('pk_order', '0');
|
2. 接入介绍
在笔者的 JPA主键生成策略介绍 也已经介绍了 JPA 规范的 @TableGenerator
注解 的相关内容。
2.1 通用场景
值得我们注意的是,在上述的主键生成器表中:
- 主键生成器表的字段,对应着
@TableGenerator
注解中的 pkColumnName 和 valueColumnName 两个属性;
- 主键生成器表的表名,对应着
@TableGenerator
注解中的 table 属性。
@TableGenerator
注解中的 pkColumnValue 属性,对应主键生成器表中 id_generator_key 字段的数据值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @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;
|
2.2 分表场景
如果存在分表场景,也可以设置分表的主键值模板,如下面的 pkColumnValue 属性;这里的 pk_order_(ORDER_ID)
中的 (ORDER_ID)
需要 分表配置 对应上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @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;
|
flea-db 模块 JPA 的分表配置,参考如下【flea-table-split.xml】:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <?xml version="1.0" encoding="UTF-8"?> <flea-table-split> <tables>
<table name="order" lib="fleaorder" exp="(FLEA_TABLE_NAME)_(ORDER_ID)" desc="Flea订单信息表分表规则"> <splits>
<split key="ONE" column="order_id" seq="SEQ"/> </splits> </table>
</tables>
</flea-table-split>
|
2.3 分库场景
如果存在分库场景,默认主键生成器表在模板库中;当然也可以让主键生成器表存放在每个分库之中,这个时候就需要使用 @FleaTableGenerator
注解 ,设置生成器标识 generatorFlag 为 false,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @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;
|
flea-db 模块 JPA 的分库配置,参考如下【flea-lib-split.xml】:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?xml version="1.0" encoding="UTF-8"?> <flea-table-split> <tables>
<table name="order" lib="fleaorder" exp="(FLEA_TABLE_NAME)_(ORDER_ID)" desc="Flea订单信息表分表规则"> <splits>
<split key="ONE" column="order_id" seq="SEQ"/> </splits> </table>
</flea-table-split>
|
3. 接入测试
可以移步 Huazie 的 GitHub,查看 《flea-jpa-test》 子项目,该子项目用于 flea-db 模块测试 JPA 相关内容使用。