2012-02-22 76 views
2

下面是我用来在数据库中保存记录然后获取生成的主键的代码。如何使用Spring JDBC在Oracle数据库中插入新行时检索生成的主键?

public void save(User user) { 
    // TODO Auto-generated method stub 
    Object[] args = { user.getFirstname(), user.getLastname(), 
      user.getEmail() }; 
    int[] types = { Types.VARCHAR, Types.VARCHAR, Types.VARCHAR }; 

    SqlUpdate su = new SqlUpdate(); 

    su.setJdbcTemplate(getJdbcTemplate()); 
    su.setSql(QUERY_SAVE); 

    setSqlTypes(su, types); 

    su.setReturnGeneratedKeys(true); 
    su.compile(); 

    KeyHolder keyHolder = new GeneratedKeyHolder(); 

    su.update(args, keyHolder); 

    int id = keyHolder.getKey().intValue(); 

    if (su.isReturnGeneratedKeys()) { 
     user.setId(id); 
    } else { 
     throw new RuntimeException("No key generated for insert statement"); 
    } 
} 

但它不工作,它给我下面的错误。

The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number] 

该行正在被正确插入到数据库中。当使用MS SQL数据库时,我可以得到一般化的主键,但是相同的代码不能与ORACLE 11G一起工作。

请帮忙。

+0

我认为Oracle ROWID可以包含字母。 getKey()方法是否具有stringValue()或类似的东西?或者它是BigInteger还是这样的东西?此外,它似乎是试图将行ID作为关键是错误的事实。 – AHungerArtist 2012-02-22 13:45:11

回答

1

正如在评论中,甲骨文rowid的是字母数字,所以不能被转换为一个int。

除此之外,您不应该在代码中的任何位置使用生成的rowid。这不是您在表格中定义的主键。

MS SQL可以选择将列作为自动递增的主键来声明。这是一个在oracle中不起作用的功能。

我总是做什么(如果不考虑该数据库支持自动递增)如下:

select sequenceName.nextval from dual 

通过前面的语句返回的值作为INSERT语句中的主键。

insert into something (pk, ...) values (:pk,:.....) 

这样我们在插入后总是有pk。

相关问题