【异常】因多租户字段缺少导致Error updating database. Column ‘tenant_id‘ cannot be null
一、报错内容
org.springframework.dao.DataIntegrityViolationException:
### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'tenant_id' cannot be null
### The error may exist in com/xxx/cloud/mall/admin/mapper/GoodsCategoryMapper.java (best guess)
### The error may involve com.xxx.cloud.mall.admin.mapper.GoodsCategoryMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO goods_category (id, enable, parent_id, name, description, sort, create_time, del_flag, tenant_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL)
### Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'tenant_id' cannot be null
; Column 'tenant_id' cannot be null; nested exception is java.sql.SQLIntegrityConstraintViolationException: Column 'tenant_id' cannot be null
二、报错说明
Cause: java.sql.SQLIntegrityConstraintViolationException: Column ‘tenant_id’ cannot be null;
报错很明显,就是因为在插入数据表 记录时候,租户字段空了,所以导致了插入失败报错。
INSERT INTO goods_category (id,ENABLE,parent_id,NAMEdescription,sort,create_time,del_flag,tenant_id
)
VALUES(?, ?, ?, ?, ?, ?, ?, ?, NULL)
2.1 为什么本地测试是成功的?
那?为什么本地测试是成功的?发沙箱了就不行了?
因为本机直接跳过了租户的判断,直接到从Gateway转到了Mall-admin
但是沙箱就不行,必需要加上租户字段,才能发起请求。
2.2 能不加租户字段吗?
查看nacos中的配置,发现,我们定义了租户表维护,
其中,刚好操作的这张表(goods_category)是一定要加租户信息的,不然就会报错
base:# 租户表维护tenant:column: tenant_idtables:- goods_category
三、报错解决
3.1 【错误尝试】是不是请求Header要加租户字段?
因为是mall-admin,是有页面的,直接发起页面请求之后,Chrome浏览器,点击键盘F12,呼出Chrome的控制台,可以获取到Header中的Token字段(Authorization)+租户字段(switch-tenant-id)

因此,可以直接拷贝到ApiFox中,再次进行接口调用,我还以为解决了,结果问题依旧!

继续排查!
3.2 【正确解决】是不是持久化时,要加tenant_id字段?
认真看一下报错,问题处在GoodsCategoryMapper上,那就在代码前后,往上追溯代码逻辑
The error may exist in com/xxx/cloud/mall/admin/mapper/GoodsCategoryMapper.java
private final JDConfigProperties jDConfigProperties;@Override
public void saveGoodsCategoryShop(GoodsCategoryImportDTO goodsCategoryImportDTO) {JSONArray goodsCategoryJsonArray = getJSONArray(goodsCategoryImportDTO);for (int i = 0; i < goodsCategoryJsonArray.size(); i++) {// 设置租户IDTenantContextHolder.setTenantId(jDConfigProperties.getTenantId());List<GoodsCategoryShop> goodsCategoryShopList = baseMapper.selectList(Wrappers.<GoodsCategoryShop>lambdaQuery().eq(GoodsCategoryShop::getId, JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("id")));//重复类目数据的过滤if (ObjectUtil.isNotEmpty(goodsCategoryShopList)) {log.info("重复店铺类目数据:levelOneCategoryId = [{}],导入失败,店铺类目数据记录已经存在", goodsCategoryImportDTO.getLevelOneCategoryId());continue;}GoodsCategoryShop goodsCategoryShop = new GoodsCategoryShop();goodsCategoryShop.setId(JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("id"));goodsCategoryShop.setName(JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("name"));goodsCategoryShop.setParentId(JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("parentId"));int sortSize = getSort(GOODS_CATEGORY_SHOP_JD_KEY);goodsCategoryShop.setSort(sortSize);addSize(GOODS_CATEGORY_SHOP_JD_KEY);goodsCategoryShop.setShopId(jDConfigProperties.getShopId());goodsCategoryShop.setTenantId(jDConfigProperties.getTenantId());goodsCategoryShop.setEnable(CommonConstants.YES);goodsCategoryShop.setCreateTime(LocalDateTime.now());goodsCategoryShop.setDelFlag(DelFlagEnum.SHOW.getValue());goodsCategoryShop.setDescription(ProductChannelEnum.JINGDONG.getDesc());baseMapper.insert(goodsCategoryShop);}
}
看到下面这一句,其实有给租户字段赋值的,那为啥还会null呢?
goodsCategoryShop.setTenantId(jDConfigProperties.getTenantId());
那就肯定是jDConfigProperties.getTenantId()有问题了
好吧,直接说结论,Nacos中,没有配置相应的租户字段呗,
加上租户字段后, 问题解决!
四、参考文章
【项目实战】商城中基于MybatisPlus多租户功能逻辑设计
【异常】因为忘加了租户查询条件,导致重复ID导入失败Duplicate entry ‘XXX‘ for key ‘PRIMARY‘
【异常】因多租户字段缺少导致Error updating database. Column ‘tenant_id‘ cannot be null
相关文章:
【异常】因多租户字段缺少导致Error updating database. Column ‘tenant_id‘ cannot be null
一、报错内容 org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Column tenant_id cannot be null ### The error may exist in com/xxx/cloud/mall/admin/mapper/Goods…...
类和对象(上)
文章目录 面向对象的初步认知类的实例化this引用对象的构造及初始化封装static成员代码块内部类 对象的打印一、面向对象的初步认知 Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。在java中…...
Java经典面试题——谈谈 Java 反射机制,动态代理是基于什么原理?
典型回答 反射机制是 Java 语言提供的一种基本功能,赋予程序在运行时 自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法ÿ…...
19 客户端服务订阅机制的核心流程
Nacos客户端服务订阅机制的核心流程 说起Nacos的服务订阅机制,大家会觉得比较难理解,那我们就来详细分析一下,那我们先从Nacos订阅的概述说起 Nacos订阅概述 Nacos的订阅机制,如果用一句话来描述就是:Nacos客户端通…...
教师论文|科技专著管理系统
技术:Java、JSP等摘要:随着计算机和互联网技术的发展,社会的信息化程度越来越高,各行各业只有适应这种发展趋势,才能增强自己的适应能力和竞争能力,不断发展壮大。大学作为教育的基地,是社会进步…...
骨传导耳机是什么意思,骨传导耳机的好处具体有哪些
在这个全民都是手机的时代,各种蓝牙耳机,入耳式耳机,真无线耳机等各种款式琳琅满目。而骨传导耳机是一种全新的科技产物,顾名思义就是通过头骨振动将声音传至外耳内的耳机。由于无需入耳,不会对耳朵造成任何影响。那…...
elasticsearch—使用汇总
文档结构1、概念简介2、使用创景3、核心组件4、环境部署5、操作实践官方网站:https://www.elastic.co/cn/elasticsearch/ 官方手册:https://www.elastic.co/guide/en/elasticsearch/reference/8.6/getting-started.html 参考教程: Aÿ…...
聊一聊代码重构——我们为什么要代码重构
代码重构 事情的起因是在去年下半年,我们终于无法承受往年的历史包袱而决定开始进行代码重构。 在以前我们尝试过进行代码重构但是从来没有系统性的考虑过如何重构。在对代码重构的过程中很多经验都是来自《重构:改善既有代码的设计》这本书,…...
【Python学习笔记】第二十九节 Python2 和Python3发生了哪些变化
Python 版本分为两大流派,一个是 Python 2.x 版本,另外一个是 Python 3.x 版本,Python 官方同时提供了对这两个版本的支持和维护。2020 年 1 月 1 日,Python 官方终止了对 Python 2.7 版本(最后一个 Python 2.x 版本&a…...
[oeasy]python0099_雅达利大崩溃_IBM的开放架构_兼容机_oem
雅达利大崩溃 回忆上次内容 个人计算机浪潮已经来临 苹果公司迅速发展微软公司脱离mits准备做纯软件公司IBM用大型机思路制作的5100惨败 Commodore 64 既做计算机又做游戏机 计算机行业和游戏行业 跟随着底层技术不断迭代已经进入了战乱纷纷的年代最终又会如何呢?…...
学术论文投稿之同行评审过程中可能会遭遇哪些偏见?
同行评审过程的顺利进行,在很大程度上取决于学术界的积极参与和相互信任,以及需要参与各方都以负责任的态度行事。作为审稿专家,向作者提供公正、客观的评价是至关重要的。同行评审过程中,若有任何偏离客观性的行为,均…...
Python写一个自动发送直播弹幕的工具,非常简单
哈喽大家好,今天给大家用Python整一个可以在直播间自动发弹幕的工具,来为喜欢的主播疯狂扣6 ! 事情原由昨晚回家,表弟在看LOL直播,看得我气不打一处来,差点就想锤他。 身为程序员的表弟,看直…...
学生档案管理系统的设计与实现
技术:Java、JSP等摘要:本设计是为托普学院学生档案的管理实现电子化而设计的,系统开发采用J2EE技术,数据库采用了SQL Server 2005,因而系统具有很好的扩展性、可移植性,实现了教学资源的信息化管理。主要功…...
JavaEE学习笔记-SpringBoot快速上手、部分注解解释
SpringBoot快速上手 一、快速创建SpringBoot应用1.1利用IDEA提供的Spring Initializr创建Spring Boot应用1.2Spring Boot生成的项目结构介绍1.3初步测试后端是否OK(建立一个controll类)二、热部署2.1 添加依赖2.2 Setting处项目自动化设置2.3 具体项目设置2.4 待选步骤三、注…...
【Python学习笔记】第二十六节 Python PyMySQL
一、什么是 PyMySQL?PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库。可以用它来连接Python和MySQL。如果你追求速度,这是一个很好的选择,因为它比mysql-connector-python快。PyMySQL 遵循 Python 数据库 API v2.0 规范&#x…...
Android问题笔记 -关于Kotlin插件版本的问题
专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断…...
【同步工具类:Phaser】
同步工具类:Phaser介绍特性动态调整线程个数层次Phaser源码分析state 变量解析构造函数对state变量赋值阻塞方法arrive()awaitAdvance()业务场景实现CountDownLatch功能代码测试结果实现 CyclicBarrier功能代码展示测试结果总结介绍 一个可重复使用的同步屏障,功能…...
Linux命令·rmdir
今天学习一下linux中命令: rmdir命令。rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的。(注意,rm - r dir命令可代替rmdir,但是有很大危险性。)删除某目录时也必须具…...
从0开始自制解释器——综述
作为一个程序员,自制自己的编译器一直是一个梦想。之前也曾为了这个梦想学习过类似龙书、虎书这种大部头的书,但是光看理论总有一些云里雾里的感觉。看完只觉得脑袋昏昏沉沉并没有觉得有多少长进。当初看过《疯狂的程序员》这本书,书里说&…...
【spring】spring5特性
1、整个 Spring5 框架的代码基于 Java8,运行时兼容 JDK9,许多不建议使用的类和方 法在代码库中删除 日志框架 2、Spring 5.0 框架自带了通用的日志封装 (1)Spring5 已经移除 Log4jConfigListener,官方建议使用 Log4j…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
