我在获取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;
}
答案 0 :(得分:1)
已在驱动程序版本12.2中修复。如果是公开的,你将有一个修复,否则你可以联系oracle支持并要求驱动程序补丁。
仍在等待12.2的公开发布