could not get next sequence value


1、觸發事件

  1. 在電腦A上敲項目代碼,數據庫原始資料是直接使用別人寫好的sql導入(建表和導入表數據等);
  2. 將電腦A上數據庫的資料,使用PL/SQL Developer導出項目中所用表(此時未導出Oracle數據庫的序列user_sequences);
  3. 將導出的表導入到電腦B的數據庫中;
  4. 在電腦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}];
  • 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;

2.3.3 刪除序列

DROP SEQUENCE 序列名;

2.4 解決異常could not get next sequence value

在使用hibernate保存數據的時候,出現了could not get next sequence value這個錯誤,這個錯誤的意思就是找不到序列中的下一個值.

那么你需要做的是:
  • 確定主鍵生成策略,到相應的表的 *.hbm.xml文件查看指明使用了的是哪個sequence(如本例圖中所示的 SEQ_SYS_JOB)
  • 登錄Oracle數據庫,然后查看該用戶下是否存在該指明的sequence(SELECT * FROM USER_SEQUENCES;)
  • 如果沒有sequence,則需要到相應的用戶下的創建該sequence(CREATE SEQUENCE 序列名;)
  • 如果該數據表中已經有值的話,還是會出現上面那個問題,因為sequence的CURRVAL值可能不符合next value(詳見 link-1link-2



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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM