【问题标题】:NPE while getting auto incremented key in Oracle 12C jdbc driver在 Oracle 12C jdbc 驱动程序中获取自动递增键时的 NPE
【发布时间】:2015-01-07 07:50:03
【问题描述】:

在取回 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)

我正在使用 spring jdbc 及其 keyHolder 来获取密钥。而在 oracle 端使用序列生成 id。

在休眠论坛的某个地方阅读,它是 jdbc 驱动程序本身的一个错误,但 oracle 论坛对我来说是有限的。 Hibernate forum link。 任何有同样问题的人以及他们如何解决这个问题。

示例代码:

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;
}

【问题讨论】:

  • 请出示相关代码。
  • 您使用的是哪个 JDBC 驱动程序版本?您可以使用DatabaseMetaData.getDriverVersion() 获取(jar 文件名称中的数字是不是驱动程序版本)
  • 通过添加示例代码和驱动程序信息更新问题。
  • "ojdbc7.jar" 不是版本,是Java 7的版本。你用的是哪个版本的驱动?
  • 我在这里不是 100% 确定,但也许你应该使用 INSERT INTO ... VALUES ... RETURINGRETURNING 子句用于此目的。也不要将 Oracle NUMBER 转换为 Double。您应该使用 BigDecimal 作为标识符。

标签: java spring oracle jdbc


【解决方案1】:

已在驱动程序版本 12.2 中修复。公开后,您将获得修复,否则您可以联系 oracle 支持并要求提供驱动程序补丁。

仍在等待 12.2 的公开发布

【讨论】:

  • 我会等待,同时我已经进入休眠状态。
  • 我使用的是 12.2.0,但仍然出现同样的错误。你能帮我吗?谢谢。
  • 在我的情况下,更改为 ojdbc8 12.2.0.1 有所帮助,升级后没有发生 NPE。 U升级后尝试PreparedStatement ps = con.prepareStatement(insertSql,new String[]{"YOUR_ID"});..
猜你喜欢
  • 2016-12-10
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多