基于Saas主键表生成主键id

简介: 首先需要对当前的id进行拦截操作,也即使用aop的切面Aspect对切点进行拦截,在进行新增的时候进行拦截:也就是说在进行主键的生成时,我们拦截好需要生成的主键,此时就可以对其进行新增操作了,而首要的就是拿到它的primaryKey。由于进行新增操作,通常分为两种情况:通过字节码拿到声明的方法getId,如果此时存在id,则说明此时的操作是更新操作,因此直接返回。如果当前通过字节码拿到的声明方法getTenant,通过租户方法拿到租户id。拿到租户id后,就可以进行主键id获取了。

1.主键生成策略方式

微信图片_20221214032645.png

主键生成策略

2.基于Saas主键表生成主键id流程

由于我们的系统时基于Saas的,因此生成主键时,需要以租户id(TenantId)为基础进行生成。为了生成的id符合我们的租户的要求,通常都会现将租户表建好,然后基于租户表中的租户id进行主键id的生成。此时便产生基于租户id生成主键,那么怎样生成主键id呢?可以查看下图:

微信图片_20221214032648.jpg

                     基于多租户生成方式

3.主键id生成实现的具体方式

首先需要对当前的id进行拦截操作,也即使用aop的切面Aspect对切点进行拦截,在进行新增的时候进行拦截:

@Pointcut("execution(* com.xtt..*.dao.mapper..*.insert*(..))")
public void primaryKeyRule() {}

也就是说在进行主键的生成时,我们拦截好需要生成的主键,此时就可以对其进行新增操作了,而首要的就是拿到它的primaryKey。由于进行新增操作,通常分为两种情况:

批量插入单条插入

因此在通过切点JoinPoint拿到参数,通过实例化来判断当前的实体是列表还是单个操作,如果是单个走单个操作,如果是批量走批量操作:

publicvoiddoBefore(JoinPointjp) {
Objectentity=jp.getArgs()[0];
if (entityinstanceofList) {
setPrimaryKeyBatch((List<Object>)entity);
        } else {
setPrimaryKey(entity, entity.getClass());
        }
    }

此时通过反射拿到声明方法中的字段,下面针对单个新增进行说明:

通过字节码拿到声明的方法getId,如果此时存在id,则说明此时的操作是更新操作,因此直接返回。如果当前通过字节码拿到的声明方法getTenant,通过租户方法拿到租户id。拿到租户id后,就可以进行主键id获取了。

privatevoidsetPrimaryKey(Objectentity, Class<?extendsObject>clazz) {
Longid= (Long)clazz.getDeclaredMethod("getId").invoke(entity);
IntegertenantId;
MethodtenantGet=clazz.getDeclaredMethod("getTenant");
tenantId= (Integer)tenantGet.invoke(entity);
//省略异常处理...// 获取类名称、租户id、需要新增的个数1id=PrimaryKeyUtils.getPrimaryKey(clazz.getSimpleName(), tenantId, 1);
// 然后通过setId 计数进行invokeclazz.getDeclaredMethod(METHOD_SET_ID, Long.class).invoke(entity, id);
// 省略异常处理...}

获取主键id:

publicstaticsynchronizedLonggetPrimaryKey(StringmodelName, IntegertenantId, intcount) {
Stringid= (tenantId==null?SystemConstant.DEFAULT_SYS_TENANT_ID : tenantId) +modelName;
Longcurrent= (Long)DBUtils.getSingle("select getPrimaryKeyWithCount('"+id+"',"+count+") from dual;");
current=current-count+1;
// 省略异常处理...returncurrent;
}

从而实现主键自增的目的,从而实现基于租户id进行自增的策略。


目录
相关文章
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
8月前
|
人工智能 自然语言处理 JavaScript
通义灵码入选南方日报 2024 数字化年度标杆
通义灵码入选南方日报 2024 数字化年度标杆
通义灵码入选南方日报 2024 数字化年度标杆
|
8月前
|
机器学习/深度学习 监控 API
本地部署DeepSeek模型技术指南
DeepSeek模型是一种先进的深度学习模型,广泛应用于自然语言处理等领域。本文详细指导如何在本地部署DeepSeek模型,涵盖环境准备(硬件和软件要求、依赖库安装)、模型下载与配置、部署(创建Flask应用、运行API)、优化(GPU加速、模型量化、ONNX Runtime)及监控维护等内容。通过本文,您将能够在本地成功部署并运行DeepSeek模型,确保其高效稳定。
|
11月前
|
架构师 数据库
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
数据库乐观锁是必知必会的技术栈,也是大厂面试高频,十分重要,本文解析数据库乐观锁。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
|
12月前
|
人工智能
写歌词的技巧和方法入门指南:点亮音乐创作梦想,妙笔生词智能写歌词软件
对于怀揣音乐创作梦想的人来说,写歌词是关键一步。本文介绍写歌词的技巧和方法,推荐使用《妙笔生词智能写歌词软件》辅助创作,涵盖 AI 智能写词、押韵优化等功能。积累灵感素材,确定主题,构建歌词结构,使用简洁而富有感染力的语言,让创作更轻松。
|
12月前
|
缓存 监控 算法
小米面试题:多级缓存一致性问题怎么解决
【10月更文挑战第23天】在现代分布式系统中,多级缓存架构因其能够显著提高系统性能和响应速度而被广泛应用。
768 3
|
机器学习/深度学习 人工智能 自然语言处理
探索AI在艺术创作中的角色:技术引领创新的艺术新篇章
【8月更文挑战第11天】AI在艺术创作中的角色正逐步从辅助工具转变为创新推动者。通过深度学习、自然语言处理、虚拟现实等先进技术,AI为艺术创作带来了无限可能性和创新空间。未来,随着技术的不断进步和应用的深入拓展,AI与艺术的交融将为我们呈现一个更加丰富多彩、充满活力的创意世界。让我们共同期待AI在艺术创作中的更多精彩表现!
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构
|
消息中间件 存储 缓存
【面试问题】MQ 如何保证消息的顺序性?
【1月更文挑战第27天】【面试问题】MQ 如何保证消息的顺序性?