Oracle PreparedStatement - 一些开发人员的 NullPointerException,但不是全部

Oracle PreparedStatement - NullPointerException for some developers, but not all

项目概览

我有一个具有以下属性的项目:

问题

我正在尝试 运行 以下准备好的语句,它应该为插入的对象输出新生成的 key/ID。不幸的是,我不断收到与语句相关的 NullPointerException。

奇怪的是,我们团队中有 75% 的人遇到了同样的问题,而我们团队中的其他 25% 的代码工作正常


问题

为什么以下代码在一台机器上运行正常,但在其他机器上返回错误?

我如何使它在所有机器上工作?


代码

    ObjectMapper mapper = new ObjectMapper();       
    KeyHolder generatedKeyHolder = new GeneratedKeyHolder();

    jdbcOracle.update(new PreparedStatementCreator() { //Line 60: This line cited as containing NullPointerException error.

        @Override
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
            PreparedStatement ps = connection.prepareStatement("INSERT INTO MY_TABLE (MY_OBJ) VALUES (?)", new String[] {"ID"});
            try {
                ps.setString(1, mapper.writeValueAsString(myObj));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            return ps;
        }

    }, generatedKeyHolder);

    System.out.println("Generated Key: " + (String)generatedKeyHolder.getKeys().get("ID"));

尝试过的解决方案

  1. 我们创建了带有序列的备用 table,而不是默认为 SYS_GUID()。
  2. 我们尝试使用 System.RETURN_GENERATED_KEY 而不是 new String[] {"ID"}
  3. 我们确保所有机器上的数据库权限都相同。
  4. 我们确认数据库驱动程序在所有机器上都是相同的。
  5. 我可以删除 , new String[] {"ID"} 参数和 , generatedKeyHolder 参数来将 preparedStatement 设置为 运行,但是由于我正在尝试获取生成的密钥,这显然打败了目的。

堆栈跟踪

2016-05-04 00:05:43.148 ERROR 3156 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause

java.lang.NullPointerException: null
    at oracle.jdbc.driver.AutoKeyInfo.initMetaDataColumnIndexes(AutoKeyInfo.java:423) ~[ojdbc7-12.1.0.jar:12.1.0.1.0]
    at oracle.jdbc.driver.AutoKeyInfo.initMetaData(AutoKeyInfo.java:396) ~[ojdbc7-12.1.0.jar:12.1.0.1.0]
    at oracle.jdbc.driver.OracleReturnResultSet.getMetaData(OracleReturnResultSet.java:77) ~[ojdbc7-12.1.0.jar:12.1.0.1.0]
    at org.springframework.jdbc.core.ColumnMapRowMapper.mapRow(ColumnMapRowMapper.java:52) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.jdbc.core.ColumnMapRowMapper.mapRow(ColumnMapRowMapper.java:48) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.doInPreparedStatement(JdbcTemplate.java:911) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.doInPreparedStatement(JdbcTemplate.java:900) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:629) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:900) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at com.mysite.impl.MyImpl.save(MyImpl.java:60)

12.1.0.1 有一个关于密钥生成的错误。使用 Oracle JDBC 驱动程序版本 12.1.0.2。 Link: http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html