標識符過長 引起的 could not get next sequence value

錯誤提示:對實體做save動作時,報由java.sql.SQLException: ORA-00972: 標識符過長,引起的could not get next sequence value的錯誤提示
問題產生環境:hibernate配置文件如下

<hibernate-mapping default-cascade="save-update">
    <class name="com.milesup.data.extra.MokaRechargeMerchantPrePay" table="MOKA_RECHARGE_MERCHANT_PRE_PAY" dynamic-insert="false" dynamic-update="false">
        <id name="id" type="int" unsaved-value="0">
            <column name="ID" sql-type="NUMBER(10)"/>
            <generator class="sequence">
                <param name="sequence">MOKA_RECHARGE_MERCHANT_PRE_PAY</param>  <!--修改前的序列值-->  修改後的序列值<!--MOKA_RC_MT_PRE_PAY_SEQ-->
            </generator>
        </id>
        <property name="merchantId" type="int">
            <column name="MERCHANT_ID" not-null="false" unique="false" sql-type="NUMBER(10)"/>
        </property>
        。。。。。。。。
    </class>
</hibernate-mapping>

問題產生原因:oracle數據庫規定序列的名稱、表名稱必須小於30個字符。由於原來序列的名稱MOKA_RECHARGE_MERCHANT_PRE_PAY已經大於30個字符,所以在再做save動作的時候,會報
由java.sql.SQLException: ORA-00972: 標識符過長,引起的could not get next sequence value問題。

解決辦法:將原來的序列的名稱MOKA_RECHARGE_MERCHANT_PRE_PAY,修改爲MOKA_RC_MT_PRE_PAY_SEQ小於30個字符,然後重新生成對應的數據庫表結構即可。

注意:
    1:如果重新修改hibernate配置文件後,沒有重新生成數據庫表結果,直接做save動作的話,那就等着報 ORA-02289: 序列不存在這個異常吧。
    2:如果該表之前通過sql直接insert過2條數據,而且經過上面的修改後是直接修改該表,注意是修改而不是刪除該表重新創建該表,那麼通過hibernate在做save這個動作的時候會報
     ORA-00001: 違反唯一約束條件 (POINT.SYS_C006384)這個錯誤,爲什麼呢?因爲你的序列是重新開始的,而開始之前,你已經通過手動插入2條數據了,怎麼解決呢?多做幾次save的動作
直到大於數據庫表中已經存在的序列id即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章