症狀:
SpringMVC+MyBatis向數據庫插入數據,主鍵應用ORACLE中自己設置的自增序列會發生如下錯誤:
nested exception is Java.sql.SQLException: 無效的列類型: getLong not implemented for class oracle.jdbc.driver.T4CRowidAccessor
解決辦法:
相應實體類映射文件中
<insert id="save" parameterType="io.renren.entity.ScheduleJobEntity" useGeneratedKeys="false" keyProperty="jobId" databaseId="oracle"> insert into "schedule_job" ( "bean_name", "method_name", "params", "cron_expression", "remark" ) values ( #{beanName,jdbcType=NVARCHAR}, #{methodName,jdbcType=VARCHAR}, #{params,jdbcType=VARCHAR}, #{cronExpression,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR} ) </insert>
將 useGeneratedKeys="true" 改為 useGeneratedKeys="false" 。
把insert 屬性里的useGeneratedKeys的屬性設置為false就可以成功插入數據了,useGeneratedKeys 要求數據庫本身具備主鍵自動增長的功能, mysql,sqlserver可以使用useGeneratedKeys =true 這功能,oracle不支持useGeneratedKeys,所以ORACLE是不能使用useGeneratedKeys =true的。
7月20日補充:
按照上面方法,雖然數據插入成功了,但是在 ScheduleJobEntity 中無法返回 jobId值,即ScheduleJobEntity.jobId為NULL,這將導致后續代碼出錯。
Oracle雖然不直接支持自增ID,但可以通過序列實現類似自增ID的效果,因此,改為以下代碼:
<insert id="save" parameterType="io.renren.entity.ScheduleJobEntity" keyProperty="jobId" databaseId="oracle"> <selectKey resultType="Long" order="BEFORE" keyProperty="jobId"> SELECT SEQ_SCHEDULE_JOB.NEXTVAL as jobId from DUAL </selectKey> insert into "schedule_job" ( "job_id", "bean_name", "method_name", "params", "cron_expression", "status", "remark" ) values ( #{jobId,jdbcType=INTEGER}, #{beanName,jdbcType=NVARCHAR}, #{methodName,jdbcType=VARCHAR}, #{params,jdbcType=VARCHAR}, #{cronExpression,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR} ) </insert>
經測試,運行正常,運行后返回插入記錄的ID給Entity。