如何使用Spring JDBC在oracle数据库中插入新行时检索生成的主键?

时间:2012-02-22 13:37:35

标签: spring oracle11g primary-key jdbctemplate

下面是我用来在数据库中保存记录然后获取生成的主键的代码。

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一起使用。

请帮忙。

1 个答案:

答案 0 :(得分:1)

在评论中,oracle rowid是alpha数字,因此不能转换为int。

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

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

我总是这样做(无论数据库是否支持自动增量)如下:

select sequenceName.nextval from dual

前一个语句返回的值用作insert语句的主键。

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

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