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

时间:2015-01-07 07:50:04

标签: java spring oracle jdbc

我在获取oracle 12c中的自动递增键时获得NPE。我正在使用oracle站点从oracle站点下载的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端使用sequence生成id。

在hibernate论坛的某处阅读,这是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;
}

1 个答案:

答案 0 :(得分:1)

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

仍在等待12.2的公开发布