getLong not implemented for class oracle.jdbc.driver.T4CRowidAccessor

症状:

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。

 

 

转载于:https://www.cnblogs.com/legendjslc/p/7159171.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值