读书人

标识符过长 唤起的 could not get nex

发布时间: 2012-10-07 17:28:51 作者: rapoo

标识符过长 引起的 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 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即可。

读书人网 >软件架构设计

热点推荐