ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-11-20 09:02:01  阅读:168  来源: 互联网

标签:generator 生成器 db 主键 表中 id ID


主键生成器表介绍

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

1. 表结构

MySQL 下的 flea_id_generator 表结构:

字段名称类型长度
id_generator_keyID生成器的键【即主键生成策略的键值名称】varchar50
id_generator_valueID生成器的值【即主键生成的值】bigint20

2. 使用

在笔者的 JPA主键生成策略介绍 也已经介绍了 JPA 规范的 @TableGenerator 注解 的相关内容。

值得关注的是,上述主键生成器表的字段,对应着 @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; // 订单编号

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

标签:generator,生成器,db,主键,表中,id,ID
来源: https://blog.csdn.net/u012855229/article/details/107258416

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有