簡述
本文講述的問題,是基于spring boot + spring data Jpa + Oracle 作為主要技術(shù)組合的項目劳曹;我們都知道奴愉,Jpa其實就是封裝了hibernate,所以在實體類這塊厚者,跟原生hibernate的做法是一樣的躁劣,只不過對接上了spring boot,就用上了許多注解库菲,比如綁定表用@Table账忘、@Entity,屬性@Column熙宇,主鍵@Id 等等鳖擒,此文暫且就不一一列舉了;下面直接曬出此次坑點的日志烫止。
坑點日志
2021-07-20 10:30:29.201 ERROR 6380 --- [ main] o.h.e.j.e.internal.JdbcEnvironmentImpl : Could not fetch the SequenceInformation from the database
java.sql.SQLException: 數(shù)字溢出
at oracle.jdbc.driver.NumberCommonAccessor.throwOverflow(NumberCommonAccessor.java:4170) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0]
at oracle.jdbc.driver.NumberCommonAccessor.getLong(NumberCommonAccessor.java:638) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0]
at oracle.jdbc.driver.GeneratedStatement.getLong(GeneratedStatement.java:228) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0]
at oracle.jdbc.driver.GeneratedScrollableResultSet.getLong(GeneratedScrollableResultSet.java:620) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0]
at oracle.jdbc.driver.GeneratedResultSet.getLong(GeneratedResultSet.java:1361) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0]
at com.zaxxer.hikari.pool.HikariProxyResultSet.getLong(HikariProxyResultSet.java) ~[HikariCP-4.0.3.jar:na]
at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.resultSetMinValue(SequenceInformationExtractorLegacyImpl.java:134) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:60) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.sequenceInformationList(JdbcEnvironmentImpl.java:403) [hibernate-core-5.4.32.Final.jar:5.4.32.Final]
2021-07-20 10:30:31.592 WARN 6380 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 17026, SQLState: 99999
2021-07-20 10:30:31.592 ERROR 6380 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : 數(shù)字溢出
2021-07-20 10:30:31.604 ERROR 6380 --- [ main] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory:
[PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.GenericJDBCException: Unable to build DatabaseInformation
日志全文看如下圖:
注意看圖中我畫紅線的地方蒋荚;
我們都知道,Oracle數(shù)據(jù)庫有序列這么一回事馆蠕,很多表的單主鍵期升,我們也會設(shè)置一個自增序列來生成主鍵的值;問題關(guān)鍵互躬,怪就怪在播赁,我的這個項目中,一個序列我都沒有定義吼渡,但是啟動項目容为,就報上面的這個錯,起初我以為是某個數(shù)值型屬性長度設(shè)置錯了寺酪,就把全部數(shù)值型的屬性都改為Long或者Double坎背,但還是報這個錯;
回頭再仔細(xì)看日志寄雀,發(fā)現(xiàn)有說到查詢什么序列之類的字眼得滤,于是去數(shù)據(jù)庫查看當(dāng)前用戶下的序列情況,發(fā)現(xiàn)都很正常啊咙俩,沒什么超長數(shù)值肮⑵荨湿故;
沒辦法,最后根據(jù)日志暴露出的這些底層源碼類去跟蹤相應(yīng)的方法膜蛔,發(fā)現(xiàn)項目在初始化數(shù)據(jù)庫相關(guān)信息的時候坛猪,回去查詢整個數(shù)據(jù)庫的所有序列,涵蓋所有數(shù)據(jù)庫用戶的序列皂股,我就去查詢其他用戶的序列墅茉,發(fā)現(xiàn)還真有幾個序列的最小值被設(shè)置為-999。呜呐。就斤。(共幾十個9)的負(fù)數(shù),難怪報數(shù)字溢出的錯蘑辑。
最后洋机,我與相關(guān)管理員探討,修改這些序列后洋魂,我的項目終于正常啟動了绷旗。
僅在此記錄一下我遇到的這個坑點,望各位道友以后能一眼辯出副砍,下篇文章我再講講序列初始化的鏈路衔肢。
好了,若覺得文章還不錯豁翎,記得點贊評論轉(zhuǎn)發(fā)哦=侵琛!心剥!