Java 在Oracle 12C jdbc驱动程序中获取自动递增密钥时的NPE
在oracle 12c中,我在取回自动递增键的同时获得了NPE。我使用的是从oracle站点为oracle 12c下载的ojdbc7.jar。版本-12.1.0.1.0。这是堆栈跟踪Java 在Oracle 12C jdbc驱动程序中获取自动递增密钥时的NPE,java,spring,oracle,jdbc,Java,Spring,Oracle,Jdbc,在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(Auto
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)
我正在使用SpringJDBC和它的钥匙夹取回钥匙,而在oracle端使用sequence生成id
阅读hibernate论坛的某个地方,这是jdbc驱动程序本身的一个bug,但是oracle论坛对我来说是受限的。
.
任何人都有同样的问题,以及他们是如何解决这个问题的
示例代码:
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;
}
它已在驱动程序版本12.2中修复。如果这是公开的,您将有一个修复程序,否则您可以联系oracle支持部门并要求提供驱动程序补丁
仍在等待12.2的公开发布,请显示相关代码。您使用的是哪个JDBC驱动程序版本?您可以使用
DatabaseMetaData.getDriverVersion()
(jar文件名中的数字不是驱动程序版本)通过添加示例代码和驱动程序信息来更新问题。“ojdbc7.jar”不是一个版本,这意味着它是针对Java 7的。你使用的是哪个版本的驱动程序?我不是100%确定,但也许你应该使用INSERT-INTO。。。价值观重试
。返回
子句就是为了这个目的。也不要将Oracle编号转换为Double。您应该使用BigDecimal作为标识符。在此期间,我将等待它。我已经移动到hibernate。我正在使用12.2.0,但仍然会收到相同的错误。你能帮忙吗?谢谢。在我的情况下,更改为ojdbc8 12.2.0.1有帮助,升级后没有出现NPE。升级后,请尝试PreparedStatement ps=con.prepareStatement(插入SQL,新字符串[]{“您的ID”})代码>