Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Oracle 12C jdbc驱动程序中获取自动递增密钥时的NPE_Java_Spring_Oracle_Jdbc - Fatal编程技术网

Java 在Oracle 12C jdbc驱动程序中获取自动递增密钥时的NPE

Java 在Oracle 12C jdbc驱动程序中获取自动递增密钥时的NPE,java,spring,oracle,jdbc,Java,Spring,Oracle,Jdbc,在oracle 12c中,我在取回自动递增键的同时获得了NPE。我使用的是从oracle站点为oracle 12c下载的ojdbc7.jar。版本-12.1.0.1.0。这是堆栈跟踪 java.lang.NullPointerException at oracle.jdbc.driver.AutoKeyInfo.initMetaDataKeyFlag(AutoKeyInfo.java:404) at oracle.jdbc.driver.AutoKeyInfo.initMetaData(Auto

在oracle 12c中,我在取回自动递增键的同时获得了NPE。我使用的是从oracle站点为oracle 12c下载的ojdbc7.jar。版本-12.1.0.1.0。这是堆栈跟踪

java.lang.NullPointerException
at oracle.jdbc.driver.AutoKeyInfo.initMetaDataKeyFlag(AutoKeyInfo.java:404)
at oracle.jdbc.driver.AutoKeyInfo.initMetaData(AutoKeyInfo.java:392)
at oracle.jdbc.driver.OracleReturnResultSet.getMetaData(OracleReturnResultSet.java:77)
at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getMetaData(DelegatingResultSet.java:322)
at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getMetaData(DelegatingResultSet.java:322)
at org.springframework.jdbc.core.ColumnMapRowMapper.mapRow(ColumnMapRowMapper.java:52)
我正在使用SpringJDBC和它的钥匙夹取回钥匙,而在oracle端使用sequence生成id

阅读hibernate论坛的某个地方,这是jdbc驱动程序本身的一个bug,但是oracle论坛对我来说是受限的。 . 任何人都有同样的问题,以及他们是如何解决这个问题的

示例代码:

public Double insert(Definition definition) {
    final String name = definition.getName();
    final String desc = definition.getDesc();
    final String type= definition.getType();
    final String insertSql = "INSERT INTO DEFINITION (ID, TYPE, NAME, DESC) VALUES (MY_SEQ.NEXTVAL,?,?,?)";
    KeyHolder holder = new GeneratedKeyHolder();

    getJdbcTemplate().update(new PreparedStatementCreator() {           

                    @Override
                    public PreparedStatement createPreparedStatement(Connection connection)
                            throws SQLException {
                        PreparedStatement ps = connection.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS);
                        ps.setString(1, type);
                        ps.setString(2, name);
                        ps.setString(3, desc);
                        return ps;
                    }
                }, holder);

    Double generatedId = holder.getKey().doubleValue();
    return generatedId;
}

它已在驱动程序版本12.2中修复。如果这是公开的,您将有一个修复程序,否则您可以联系oracle支持部门并要求提供驱动程序补丁


仍在等待12.2的公开发布,请显示相关代码。您使用的是哪个JDBC驱动程序版本?您可以使用
DatabaseMetaData.getDriverVersion()
(jar文件名中的数字不是驱动程序版本)通过添加示例代码和驱动程序信息来更新问题。“ojdbc7.jar”不是一个版本,这意味着它是针对Java 7的。你使用的是哪个版本的驱动程序?我不是100%确定,但也许你应该使用
INSERT-INTO。。。价值观重试
返回
子句就是为了这个目的。也不要将Oracle编号转换为Double。您应该使用BigDecimal作为标识符。在此期间,我将等待它。我已经移动到hibernate。我正在使用12.2.0,但仍然会收到相同的错误。你能帮忙吗?谢谢。在我的情况下,更改为ojdbc8 12.2.0.1有帮助,升级后没有出现NPE。升级后,请尝试
PreparedStatement ps=con.prepareStatement(插入SQL,新字符串[]{“您的ID”})