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