1、觸發事件
- 在電腦A上敲項目代碼,數據庫原始資料是直接使用別人寫好的sql導入(建表和導入表數據等);
- 將電腦A上數據庫的資料,使用PL/SQL Developer導出項目中所用表(此時未導出Oracle數據庫的序列user_sequences);
- 將導出的表導入到電腦B的數據庫中;
- 在電腦B中運行項目,在持久化某個實例時發生異常 " org.springframework.dao.InvalidDataAccessResourceUsageException: could not get next sequence value; SQL [select SEQ_SYS_JOB.nextval from dual]; nested exception is org.hibernate.exception.SQLGrammarException: could not get next sequence value "

2、知之為知之
廣大網友的力量是無窮無盡的,本文相關知識點參考鏈接:
2.1 什么是sequence
序列(SEQUENCE)其實是序列號生成器,可以為表中的行自動生成序列號,產生一組等間隔的數值(類型為數字)。
其主要的用途是生成表的主鍵值,可以在插入語句中引用,也可以通過查詢檢查當前值,或使序列增至下一個值。
2.2 Hibernate和sequence的關系

我們已經知道,sequence可以用來生成表中每條記錄的主鍵,這意味着你對於主鍵的自增長不需要過多地管理,你每添加一個數據,它就會自動為你的主鍵字段進行賦值。
而Hibernate作為持久化作用的框架,在進行數據保存到表的過程中,就可以采取sequence方式來作為主鍵的一種生成策略。當然,
這有兩個方面的工作需要你去做:
- 在 *.hbm.xml 中對於你希望采用sequence序列生成主鍵的字段,進行配置<generator class ...> (如上圖紅框標記處)
- 采用數據庫提供的sequence機制生成主鍵,需要數據庫支持sequence,如Oralce、DB、SAP DB、PostgerSQL 等,但是MySQL並不支持(可以使用identity)
2.3 Oracle中sequence的用法
2.3.1 創建序列
創建序列需要CREATE SEQUENCE系統權限。序列的創建語法如下:
CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [CYCLE|NOCYCLE] [{CACHE n|NOCACHE}];
1
1
CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [CYCLE|NOCYCLE] [{CACHE n|NOCACHE}];
- INCREMENT BY:用於定義序列的步長,如果省略,則默認為1,如果出現負值,則代表序列的值是按照此步長遞減的
- START WITH:定義序列的初始值(即產生的第一個值),默認為1
- MAXVALUE:定義序列生成器能產生的最大值。選項NOMAXVALUE是默認選項,代表沒有最大值定義
- MINVALUE:定義序列生成器能產生的最小值。選項NOMAXVALUE是默認選項,代表沒有最小值定義
- CYCLE 和 NOCYCLE:表示當序列生成器的值達到限制值后是否循環,CYCLE代表循環,NOCYCLE代表不循環。如果不循環,達到限制值后,繼續產生新值就會發生錯誤
- CACHE 和 NOCACHE:定義存放序列的內存塊的大小,默認為20。NOCACHE表示不對序列進行內存緩沖。對序列進行內存緩沖,可以改善序列的性能
2.3.2 查看序列
SELECT * FROM USER_SEQUENCES;
1
1
SELECT * FROM USER_SEQUENCES;
2.3.3 刪除序列
DROP SEQUENCE 序列名;
1
1
DROP SEQUENCE 序列名;
2.4 解決異常could not get next sequence value
在使用hibernate保存數據的時候,出現了could not get next sequence value這個錯誤,這個錯誤的意思就是找不到序列中的下一個值.
那么你需要做的是:

最終,異常就這樣解決了,皆大歡喜。