前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Saas主键表生成主键id

基于Saas主键表生成主键id

作者头像
路行的亚洲
发布2021-06-24 14:15:01
1.7K0
发布2021-06-24 14:15:01
举报
文章被收录于专栏:后端技术学习后端技术学习
1.主键生成策略方式

主键生成策略

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

基于多租户生成方式

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

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

代码语言:javascript
复制
@Pointcut("execution(* com.xtt..*.dao.mapper..*.insert*(..))")
public void primaryKeyRule() {}

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

代码语言:javascript
复制
批量插入
单条插入

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

代码语言:javascript
复制
public void doBefore(JoinPoint jp) {
        Object entity = jp.getArgs()[0];
        if (entity instanceof List) {
            setPrimaryKeyBatch((List<Object>)entity);
        } else {
            setPrimaryKey(entity, entity.getClass());
        }
    }

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

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

代码语言:javascript
复制
private void setPrimaryKey(Object entity, Class<? extends Object> clazz) {
        Long id = (Long)clazz.getDeclaredMethod("getId").invoke(entity);
        Integer tenantId;
        Method tenantGet = clazz.getDeclaredMethod("getTenant");
        tenantId = (Integer)tenantGet.invoke(entity);
        //省略异常处理...
        // 获取类名称、租户id、需要新增的个数1
        id = PrimaryKeyUtils.getPrimaryKey(clazz.getSimpleName(), tenantId, 1);
        // 然后通过setId 计数进行invoke
        clazz.getDeclaredMethod(METHOD_SET_ID, Long.class).invoke(entity, id);
      // 省略异常处理...
}

获取主键id:

代码语言:javascript
复制
public static synchronized Long getPrimaryKey(String modelName, Integer tenantId, int count) {
    String id = (tenantId == null ? SystemConstant.DEFAULT_SYS_TENANT_ID : tenantId) + modelName;
    Long current = (Long)DBUtils.getSingle("select getPrimaryKeyWithCount('" + id + "'," + count + ") from dual;");
        current = current - count + 1;
    // 省略异常处理...
    return current;
}

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端技术学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.主键生成策略方式
  • 2.基于Saas主键表生成主键id流程
  • 由于我们的系统时基于Saas的,因此生成主键时,需要以租户id(TenantId)为基础进行生成。为了生成的id符合我们的租户的要求,通常都会现将租户表建好,然后基于租户表中的租户id进行主键id的生成。此时便产生基于租户id生成主键,那么怎样生成主键id呢?可以查看下图:
  • 3.主键id生成实现的具体方式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档