版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/106771815
今天在做 SSH 整合的時候,在啓動 Tomcat 時報異常,經過查閱相關資料,終於把它解決了,順便來個總結吧。。。。
說起這個異常來,真的是特別頭疼,請教了很多有十幾年開發經驗的大牛都沒有解決,最終還得靠自己探索啊。。。
話不多說,先把異常信息放上來讓大家看看。
異常信息:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.tool.schema.extract.spi.SchemaExtractionException: More than one table found in namespace (, ) : t_user
大概意思是:
從庫中找到了多個名字叫 t_user
的表。
很納悶:
根據異常提示信息去庫中找另一張 t_user
表,根本沒有!我的庫中就那麼三張表,難道我眼睛出問題了?帶着這個問題去尋訪百度,也沒有什麼解決方案,拿着報錯信息和 Demo 去羣裏找大牛,反倒被大家說了一頓:什麼時候了還用 SSH,快換成 Spring Boot 吧,基礎沒學好,Hibernate 自動創建表你沒搞懂啊。。。反正啊說了一堆沒用的東西。
解決方案:
最後我想到了可能是 MySQL 驅動問題,經過測試還真是。。我一開始用的是 mysql-connector-java-8.0.16.jar
,後來換成 mysql-connector-java-5.1.43.jar
就莫名其妙的好了。我只知道 8.0
版本在數據庫連接驅動信息發生了改變,由原來的 com.mysql.jdbc.Driver
變成了 com.mysql.cj.jdbc.Driver
,其他的就不知道了,於是我開始尋找 8.0
和 5.x
的區別,後來在網上一篇博客中得知:原來在 6.x
版本驅動的時候就將參數 nullCatalogMeansCurrent
的默認值由 true
改爲了 false
。
這個參數的意思是:是否默認返回 datasource 指定庫的表。也就是如果爲 true
,那麼就從我們指定的數據庫中找表;如果爲 false
,那麼就從所有庫中找表。
這下相信大家也明白了吧,我找遍了所有的庫,果然在一個不起眼的庫中找到了相同名字 t_user
的表。
解決方案我這裏總結了兩種:
-
將 MySQL 驅動
8.0
版本的降低到5.x
版本; -
初始化連接的時候,爲
nullCatalogMeansCurrent
參數指定爲true
:jdbc.url=jdbc:mysql:///sys?useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
如果還有更好的解決方案請在留言處告知我,謝謝!