下面是我用来在数据库中保存记录,然后获取生成的主键的代码。
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。
请帮忙。
在注释中,oracle rowid是字母数字,因此不能强制转换为int。
除此之外,您不应该在代码中的任何位置使用生成的rowid。这不是您在表中定义的主键。
MS SQL可以选择将列声明为自动递增的主键。这是一个在oracle中不起作用的功能。
我一直在做的事情(不管数据库是否支持自动增量)如下:
select sequenceName.nextval from dual
上一条语句返回的值用作insert语句的主键。
insert into something (pk, ...) values (:pk,:.....)
这样,我们总是在插入之后有pk。