zoukankan      html  css  js  c++  java
  • 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。

     
  • 相关阅读:
    $.each与$().each
    冒泡排序和用for循环画菱形
    windows10, 安装wamp无法启动服务的问题
    使用MySql数据库, 浏览器接收返回数据报错SyntaxError: unterminated string literal
    SWT, JFace必须的jar包和有可能会用到的jar
    easyui中tree使用simpleData的形式加载数据
    树形菜单的json字符串的拼接
    选择合适的String拼接方法(这篇博客是我抄的)
    hibernate进行多表联合查询
    操作文件和目录
  • 原文地址:https://www.cnblogs.com/legendjslc/p/7159171.html
Copyright © 2011-2022 走看看