【发布时间】: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 ... RETURING。RETURNING子句用于此目的。也不要将 Oracle NUMBER 转换为 Double。您应该使用 BigDecimal 作为标识符。