关于Mybatis-Plus报错 Not Found TableInfoCache 解决办法

        • 0. 接口结构:
        • 1. 方法报错:
        • 2. 解决方法:
        • 3. 原因分析:

0. 接口结构:

【接口】:

public interface PurchaseOrderService extends IService<PurchaseOrder> {}

【接口实现类】:

public class PurchaseOrderServiceImpl extends BasePurchaseOrderService implements PurchaseOrderService {}

【实现类基类】

abstract class BasePurchaseOrderService extends ServiceImpl<PurchaseOrderMapper, PurchaseOrder> {}

结构:不同类型的订单会有不同是实现类,对于一些公共的操作,会在基类中实现

1. 方法报错:
  • 当执行Mybatis-Plus的ServiceImpl一些方法,比如updateBatchById、saveBatch等
  • 便会报错:Not Found TableInfoCache
2. 解决方法:
  • 修改接口结构,基类使用<M,T>泛型,M:Mapper类;T:对应的Model类

【接口实现类】:

public class PurchaseOrderServiceImpl extends BasePurchaseOrderService<PurchaseOrderMapper, PurchaseOrder> implements PurchaseOrderService {}

【实现类基类】

abstract class BasePurchaseOrderService<M extends BaseMapper<T>, T> extends ServiceImpl<PurchaseOrderMapper, PurchaseOrder> {}
  • 此外,还有一种解决方法,参考连接:https://github.com/baomidou/mybatis-plus/issues/578
  • 就是重写ServiceImpl的currentModelClass方法和currentMapperClass方法
abstract class BasePurchaseOrderService extends ServiceImpl<PurchaseOrderMapper, PurchaseOrder> implements BaseService<PurchaseOrder> {@Overrideprotected Class<PurchaseOrder> currentModelClass() {return (Class<PurchaseOrder>) GenericTypeResolver.resolveTypeArgument(getClass(), BaseService.class);}// currentMapperClass的重写方法不知道怎么实现... ... 
}public interface BaseService<T> extends IService<T>{}
3. 原因分析:
  • updateBatchById来,调用链路:
  • executeBatch ➡ sqlSessionFactory ➡ currentSessionFactory ➡ getTableInfo

在这里插入图片描述


/*** IService 实现类( 泛型:M 是 mapper 对象,T 是实体 )** @author hubin* @since 2018-06-23*/
@SuppressWarnings("unchecked")
public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {protected Class<T> entityClass = currentModelClass();protected Class<T> mapperClass = currentMapperClass();/*** 执行批量操作** @param consumer consumer* @since 3.3.0* @deprecated 3.3.1 后面我打算移除掉 {@link #executeBatch(Collection, int, BiConsumer)} }.*/@Deprecatedprotected boolean executeBatch(Consumer<SqlSession> consumer) {return SqlHelper.executeBatch(this.entityClass, this.log, consumer);}

在这里插入图片描述
在这里插入图片描述

  • 显然:getTableInfo获取为null才报的错,从报错也知道,此时的class 为java.lang.Object
  • 显然获取的class不对,而class就是ServiceImpl的entityClass
  • 默认下,entityClass取的父类的第2个泛型参数,mapperClass取的父类的第1个泛型参数

在这里插入图片描述

  • 也就是说,像本例多继承的情况下,由于父类BasePurchaseOrderService没有泛型参数
  • 对于currentModelClass方法,最终获取了java.lang.Object
  • 最终报错了
public class PurchaseOrderServiceImpl extends BasePurchaseOrderService implements PurchaseOrderService {}
  • 所以解决方法就很容易理解,给继承的父类方法加上对应的<M,T>泛型参数即可
  • 或者重写对应的方法,让其返回正确的entityClass,mapperClass
  • 正常没有多继承的情况,是不是就没问题,其父类ServiceImpl有泛型参数
  • mapperClass 为PurchaseOrderMapper;entityClass为PurchaseOrder
public class PurchaseOrderServiceImpl extends ServiceImpl<PurchaseOrderMapper, PurchaseOrder> implements PurchaseOrderService {}
  • 另外提一下,mapperClass用于获取sqlStatement
  • String sqlStatement = getSqlStatement(SqlMethod.UPDATE_BY_ID);
  • 最终:sqlStatement = mapper.getName() + StringPool.DOT + sqlMethod.getMethod();
  • 而sqlStatement用于获取最终的语句执行,不正确的sqlStatement最终获执行报错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/725237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】新手入门(5):# -*- coding: UTF-8 -*- 的作用详解

【Python】新手入门&#xff08;5&#xff09;&#xff1a;# -*- coding: UTF-8 -*- 的作用详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础…

ssm基于javaEE+springboot校园闲置二手物品拍卖交易平台_ngad7

为提升浏览用户观感及使用体验&#xff0c;本系统要具有易用性和美观性。通过页面的简单提示就可完成操作&#xff0c;校园闲置物品交易平台展示界面应该清楚简洁&#xff0c;使用户通过美观的前台页面能快速定位想要浏览的校园闲置物品交易平台信息。后台界面也应简约&#xf…

java岗位面试题总结,关于网络优化你必须要知道的重点

前言 最近有很多朋友向我求教经验&#xff0c;因为我自己工作相对于稳定&#xff0c;在这里给大家分享一个粉丝朋友的经历&#xff0c;他作为一个曾经的菜鸡面试者&#xff0c;在不断的失败中成长&#xff0c;最终斩获了多份offer&#xff0c;因此特别想在此分享一下他的面试成…

【C++精简版回顾】20.模板的使用

1.模板起源 1.模板的定义 1.针对函数属性模板 //针对函数属性 template <class VOID > VOID print1(int a) {cout << a << endl; } 2.针对数据属性模板 //针对数据属性 template <typename INT,typename FLOAT> void print2(INT a,FLOAT b) {cout <…

从零学习Linux操作系统 第三十部分 部署Anisble

一、ansible实验环境的部署 主控机 更改服务器主机名 hostnamectl set-hostname westos_ansible.westos.org 主服务器需要能够实现上网 修改网卡使之能够上网 能ping通 代表可以连接外网 搭载本地软件仓库 并且挂载镜像 装载 dnf install httpd -y 让其开机启动并且…

【C#面向对象设计模式】02. Singleton单件(创建型模式)

【C#面向对象设计模式】02. Singleton单件&#xff08;创建型模式&#xff09; 0. 模式分类 从目的来看&#xff1a; 创建型模式&#xff1a;负责对象创建。结构型模式&#xff1a;处理类与对象间的组合。行为型模式&#xff1a;类与对象交互中的职责分配。 从范围来看&#…

.kat6.l6st6r勒索病毒的最新威胁:如何恢复您的数据?

导言&#xff1a; 在当今数字化时代&#xff0c;数据安全变得至关重要。然而&#xff0c;随着网络威胁不断增加&#xff0c;勒索病毒已成为企业和个人面临的严重威胁之一。其中&#xff0c;.kat6.l6st6r勒索病毒是最新的变种之一&#xff0c;它能够加密您的数据文件&#xff0…

解密程序员的“藏宝图”:我的祖传代码大公开

程序员是如何看待“祖传代码”的&#xff1f; 大家好&#xff0c;我是小明&#xff0c;一位充满好奇心和分享热情的程序员。今天&#xff0c;我要为大家揭开我心中的“藏宝图”——那些我认为值得传世的祖传代码。让我们一同踏上这场奇妙的代码冒险之旅吧&#xff01; 宝物一…

vue-路由跳转和路由传参!!!

需求&#xff1a;在修改商品时&#xff0c;会进行页面跳转&#xff0c;通过点击修改按钮进行页面跳转。这时我们需要将商品的id携带过去 一、首先我们在查询页面实现路由跳转并携带参数。 1.1、修改按钮 <el-button type"primary" size"small" click&qu…

体验Node.js的安装和运行

Node.js概述 Node.js是一个基于Chrome V8引擎的JavaScript运行环境。它允许JavaScript代码在服务器端运行&#xff0c;使得开发人员可以使用同一种语言编写前端和后端的代码。Node.js使用事件驱动、非阻塞I/O模型&#xff0c;使其轻量且高效&#xff0c;非常适合数据密集型的实…

Leetcode : 506. 相对名次

思路 &#xff1a; 遍历计算每个元素比它大的元素个数&#xff0c;并判断做出对应结果标签&#xff1b; #include <iostream> #include <vector>using namespace std;class Solution { public:vector<string> findRelativeRanks(vector<int>& scor…

短剧系统开发:一种新型的娱乐方式

一、引言 随着科技的快速发展&#xff0c;人们的生活方式也在逐渐改变。在娱乐领域&#xff0c;短剧作为一种新型的娱乐方式&#xff0c;正在受到越来越多人的喜爱。短剧以其短小精悍、情节紧凑、易于观看等特点&#xff0c;迅速占领了市场。因此&#xff0c;开发一款短剧系统…

【自然语言处理】【大模型】BitNet:用1-bit Transformer训练LLM

BitNet&#xff1a;用1-bit Transformer训练LLM 《BitNet: Scaling 1-bit Transformers for Large Language Models》 论文地址&#xff1a;https://arxiv.org/pdf/2310.11453.pdf 相关博客 【自然语言处理】【大模型】BitNet&#xff1a;用1-bit Transformer训练LLM 【自然语言…

coqui-ai/TTS 安装使用

Coqui AI的TTS是一款开源深度学习文本转语音工具&#xff0c;以高质量、多语言合成著称。它提供超过1100种语言的预训练模型库&#xff0c;能够轻松集成到各种应用中&#xff0c;并允许用户通过简单API进行个性化声音训练与微调。其技术亮点包括但不限于低资源适应性&#xff0…

RabbitMQ是如何保证高可用的?

RabbitMQ可以通过多种方式来实现高可用性&#xff0c;以确保在硬件故障或其他不可预测的情况下&#xff0c;消息队列系统仍然能够正常 运行。RabbitMQ有三种模式&#xff1a;单机模式&#xff0c;普通集群模式&#xff0c;镜像集群模式。 其中单机模式一般用于demo搭建&#x…

STM32CubeMX学习笔记14 ---SPI总线

1. 简介 1.1 SPI总线介绍 SPI 是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在…

softmax和sigmoid的区别

sigmoid 公式&#xff1a; s i g m o i d ( x ) 1 1 e − x sigmoid(x) \frac{1}{1 e^{-x}} sigmoid(x)1e−x1​ 函数曲线如下&#xff1a; 导数公式&#xff1a; f ( x ) ′ e − x ( 1 e − x ) 2 f ( x ) ( 1 − f ( x ) ) f(x)\prime \frac{ e^{-x}}{(1 e^{-x})…

主流电商平台API接口太多?如何选择合适的接口你要的API 接口都给你整理好了~

接口太多不知道怎么选&#xff1f; &#x1f447; 看我给您整理的电商API接口就很一目了然啦 ~ 淘宝平台API商品采集接口 此API目前支持以下基本接口&#xff1a; item_get 获得淘宝商品详情item_get_pro 获得淘宝商品详情高级版item_review 获得淘宝商品评论item_fee 获得淘…

【CSP试题回顾】201604-1-折点计数

CSP-201604-1-折点计数 解题代码 #include <iostream> #include <vector> #include <algorithm> using namespace std;int n, pointSum;int main() {cin >> n;vector<int>myData(n);for (int i 0; i < n; i){cin >> myData[i];}// 统…

【MybatisPlus】QueryWrapper、UpdateWrappe、LambdaQueryWrapper、LambdaUpdateWrapper

一、Wrapper简介 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都是 MyBatis-Plus 框架中用于构建条件的工具类&#xff0c;它们之间的关系是继承关系。其中 QueryWrapper 和 UpdateWrapper 是基于普通的对象属性名来构建条件的&#xff0c;而 La…