調(diào)用Mybatis?plus中的saveBatch方法報找不到表的問題
1.問題現(xiàn)象
在用Mybatis plus開發(fā)的項目中,用自帶的API批量保存的方法saveBatch操作時,發(fā)現(xiàn)報沒有找到表的錯誤。
錯誤日志截圖如下:
表實(shí)際是存在的,且發(fā)現(xiàn)其他的方法都沒有問題,包括save、update等單個的方法,都是正常的。百思不得其解,配置和代碼都沒有問題。
下面是該數(shù)據(jù)源對應(yīng)的配置文件。
dataSourceConfig中配置的mapperLocations的位置:
其apollo中配置的value值為:classpath*:/mapper/*.xml
原來的maper.xml路徑:
2.問題分析
在項目中用了2個數(shù)據(jù)源,上面是其中的一個數(shù)據(jù)源。
另一個數(shù)據(jù)源的mapper.xml配置的路徑是:
其apollo中配置的value值也為:classpath*:/mapper/*.xml
本來是想保存數(shù)據(jù)到A數(shù)據(jù)庫,結(jié)果是執(zhí)行的是另一個數(shù)據(jù)庫B,其實(shí)是因?yàn)?SqlSessionFactory 錯誤導(dǎo)致的。
項目中有2個數(shù)據(jù)源,分別用的不同的 SqlSessionFactory。
經(jīng)分析跟蹤代碼后發(fā)現(xiàn)執(zhí)行saveBatch后最終調(diào)用到了這個方法:
public static boolean executeBatch(Class<?> entityClass, Log log, Consumer<SqlSession> consumer) { SqlSessionFactory sqlSessionFactory = sqlSessionFactory(entityClass); SqlSessionHolder sqlSessionHolder = (SqlSessionHolder) TransactionSynchronizationManager.getResource(sqlSessionFactory); boolean transaction = TransactionSynchronizationManager.isSynchronizationActive(); if (sqlSessionHolder != null) { SqlSession sqlSession = sqlSessionHolder.getSqlSession(); //原生無法支持執(zhí)行器切換,當(dāng)存在批量操作時,會嵌套兩個session的,優(yōu)先commit上一個session //按道理來說,這里的值應(yīng)該一直為false。 sqlSession.commit(!transaction); } SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); if (!transaction) { log.warn("SqlSession [" + sqlSession + "] was not registered for synchronization because DataSource is not transactional"); }
com.baomidou.mybatisplus.core.metadata.TableInfoHelper 中 initTableInfo方法會將每個實(shí)體類與對應(yīng)的數(shù)據(jù)庫配置保存到緩存:TABLE_INFO_CACHE
中
也就是,我們在創(chuàng)建 SqlSessionFactory 時候設(shè)置的 setMapperLocations, 設(shè)置路徑下的所有mapper.xml 對應(yīng)的實(shí)體都會保存對應(yīng)的數(shù)據(jù)庫配置。
因此,我們需要將不同的 SqlSessionFactory 配置,用不同的 mapper 目錄來掃描。不同數(shù)據(jù)源的操作,放在各自的 mapper 子目錄下,作區(qū)分。
上面我們定義2個SqlSessionFactory中配置的mapper文件路徑是一樣的。
由于 classpath*:mapper/**/*Mapper.xml 路徑一樣,導(dǎo)致初始化實(shí)體類和數(shù)據(jù)庫配置對應(yīng)關(guān)系,被覆蓋的現(xiàn)象。
即同樣的 mapper.xml 文件中被不同的 SqlSessionFactory 掃描了兩次,導(dǎo)致mapper.xml中的實(shí)體類信息只有一種SqlSessionFactory信息。
3.解決辦法
需要將其中的一個數(shù)據(jù)源對應(yīng)的mapper文件映射的路徑改一下,改成和另一個數(shù)據(jù)源配置的路徑不同,就可以了。
修改后的路徑:
到此這篇關(guān)于調(diào)用Mybatis plus中的saveBatch方法報找不到表的問題的文章就介紹到這了,更多相關(guān)Mybatis plus saveBatch找不到表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java打包成jar并執(zhí)行jar包中指定的main方法
這篇文章主要介紹了如何將java打包成可執(zhí)行的jar,并執(zhí)行jar包中指定的main方法的相關(guān)資料,文中給出了詳細(xì)的示例代碼,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03Java Spring 控制反轉(zhuǎn)(IOC)容器詳解
這篇文章主要為大家詳細(xì)介紹了Spring控制反轉(zhuǎn)IoC入門使用的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10Spring Boot熱加載jar實(shí)現(xiàn)動態(tài)插件的思路
本文主要介紹在 Spring Boot 工程中熱加載 jar 包并注冊成為 Bean 對象的一種實(shí)現(xiàn)思路,在動態(tài)擴(kuò)展功能的同時支持在插件中注入主程序的 Bean 實(shí)現(xiàn)功能更強(qiáng)大的插件2021-10-10List對象去重和按照某個字段排序的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄狶ist對象去重和按照某個字段排序的實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Java8 Optional優(yōu)雅空值判斷的示例代碼
這篇文章主要介紹了Java8 Optional優(yōu)雅空值判斷的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05