flea-db使用之主键生成器表介绍

简介: 本篇介绍JPA规范下的主键生成器表,相关主键生成策略可查看 JPA主键生成策略介绍。

jpa.png

引言

本篇介绍JPA规范下的主键生成器表,相关主键生成策略可查看 [JPA主键生成策略介绍]。

1. 主键生成器表

MySQL 下的 flea_id_generator 表结构:

字段 名称 类型 长度
id_generator_key ID生成器的键【即主键生成策略的键值名称】 varchar 50
id_generator_value ID生成器的值【即主键生成的值】 bigint 20

相关 SQL 如下:

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 注解中的 pkColumnNamevalueColumnName 两个属性;
  • 主键生成器表的表名,对应着 @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; // 订单编号

2.2 分表场景

如果存在分表场景,也可以设置分表的主键值模板,如下面的 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; // 订单编号

flea-db 模块 JPA 的分表配置,参考如下【flea-table-split.xml】:

<?xml version="1.0" encoding="UTF-8"?>
<flea-table-split>
    <tables>

        <!-- 分表配置
            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.fleaframework.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>

    </tables>

    <!-- 其他模块分表配置文件引入 -->
    <!--<import resource=""/>-->

</flea-table-split>

2.3 分库场景

如果存在分库场景,默认主键生成器表在模板库中;当然也可以让主键生成器表存放在每个分库之中,这个时候就需要使用 @FleaTableGenerator 注解 ,设置生成器标识 generatorFlagfalse,如下所示:

    @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】:

<?xml version="1.0" encoding="UTF-8"?>
<flea-table-split>
    <tables>

        <!-- 分表配置
            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.fleaframework.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>

</flea-table-split>

3. 接入测试

可以移步 Huazie 的 GitHub,查看 《flea-jpa-test》 子项目,该子项目用于 flea-db 模块测试 JPA 相关内容使用。

目录
相关文章
|
7月前
|
Java 关系型数据库 MySQL
flea-db使用之JPA封装介绍
【4月更文挑战第3天】本篇 Huazie 介绍 Flea 框架下的 flea-db模块中的 JPA 封装代码
93 6
flea-db使用之JPA封装介绍
|
关系型数据库 索引
DB2查询主键、索引、表约束
DB2查询主键、索引、表约束
833 0
|
7月前
|
SQL Java 数据库
flea-db使用之JPA分库分表实现
【4月更文挑战第7天】本篇 Huazie 介绍 Flea 框架下的 flea-db 模块中JPA分库分表实现
98 1
flea-db使用之JPA分库分表实现
|
XML Java 数据库连接
【MySQL用法】MyBatis 多对多 中间表插入数据,添加记录后获取主键ID
【MySQL用法】MyBatis 多对多 中间表插入数据,添加记录后获取主键ID
185 0
|
7月前
|
存储 关系型数据库 MySQL
用雪花 ID 和 UUID 做 MySQL 主键,可以吗?
用雪花 ID 和 UUID 做 MySQL 主键,可以吗?
129 0
用雪花 ID 和 UUID 做 MySQL 主键,可以吗?
|
7月前
|
SQL Oracle 关系型数据库
SQL PRIMARY KEY 约束- 唯一标识表中记录的关键约束
SQL NOT NULL 约束用于强制确保列不接受 NULL 值。这意味着该字段始终包含一个值,而不允许插入新记录或更新记录时不提供此字段的值。
147 0
|
SQL 关系型数据库 MySQL
mysql表中怎么将主键的类型设置为UUID
mysql表中怎么将主键的类型设置为UUID
|
SQL Oracle 关系型数据库
SQL Server2019数据库查询所有数据库名、表名、表结构、表字段、主键方法演示,执行sql提示对象名‘user_tab_columns‘、 ‘user_cons_columns‘ 无效问题解决
SQL Server2019数据库查询所有数据库名、表名、表结构、表字段、主键方法演示,执行sql提示对象名‘user_tab_columns‘、 ‘user_cons_columns‘ 无效问题解决
464 0
|
关系型数据库 MySQL 数据库
MySQL创建数据库 easyShopping,包括area表、goods表、customer表、orders表、ordersdetall表、test表
MySQL创建数据库 easyShopping,包括area表、goods表、customer表、orders表、ordersdetall表、test表
956 0
MySQL创建数据库 easyShopping,包括area表、goods表、customer表、orders表、ordersdetall表、test表
|
弹性计算 关系型数据库 测试技术
PostgreSQL 分区表如何支持多列唯一约束 - 枚举、hash哈希 分区, 多列唯一, insert into on conflict, update, upsert, merge insert
标签 PostgreSQL , 分区表 , native partition , 唯一 , 非分区键唯一 , 组合唯一 , insert into on conflict , upsert , merge insert 背景 PG 11开始支持HASH分区,10的分区如果要支持hash分区,可以通过枚举绕道实现。 《PostgreSQL 9.x, 10, 11 hash分区表 用法举例
3134 0