--------------------------------------------------------前言(废话一点点儿,不需要的请忽略)--------------------------------------------
之前用Mysql库,我们的公共保存方法:
/**
* 插入数据返回数据ID (经验证)
*
* @param sql
* @param Bean
* @return
*/
public int addObject(String sql, Object bean) {
SqlParameterSource param = new BeanPropertySqlParameterSource(bean);
KeyHolder keyHolder = new GeneratedKeyHolder();
this.simpleJdbcTemplate.getNamedParameterJdbcOperations().update(sql,
param, keyHolder);
return keyHolder.getKey().intValue();
}
后来改用oracle库,修改公共保存数据方法为:
/**
*
* @param sql
* @param bean
*/
public void addOracleObject(String sql, Object bean) {
SqlParameterSource param = new BeanPropertySqlParameterSource(bean);
this.simpleJdbcTemplate.getNamedParameterJdbcOperations().update(sql,param);
}
//当然我的sql里会注明主键自增相关的序列如:
//insert into processes(id,proname,startfilepath,itemtype) values(processes_seq.nextval,:proname,:startfilepath,:itemtype)
------------------------------------------------------------------OK,进入正题----------------------------------------------------------------------------------------------------
移库后保存的方法,当然用的是addOracleObject,不久发现刚刚保存好的对象需要它的主键,如:表processes我需要id
可是addObject在Oracle中可不适用,大致的报错情况是:
DataRetrievalFailureException:
The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number]
很纠结啊…………
于是google了一下,
感谢上面的回答,问题终于得以解决,解决方案:
/**
* 插入数据返回数据ID (经验证)
*
* @param sql
* @param Bean
* @return
*
* oracle 保存 返回主键
*/
public int addOracleObject(String sql, Object bean) {
SqlParameterSource param = new BeanPropertySqlParameterSource(bean);
KeyHolder keyHolder = new GeneratedKeyHolder();
this.simpleJdbcTemplate.getNamedParameterJdbcOperations().update(sql,
param, keyHolder,new String[]{"id"});
return keyHolder.getKey().intValue();
}
----------------------------------------------------------------分割线(End)--------------------------------------------------------------------------------------------------------------
总结:
(1)spring 的 SimpleJdbcTemplate掌握的不够好,不能灵活运用;
(2)即使查看源码,仍然无法解决,个人能力需要提升;
(3)看到上面解决方案,全部是English,居然退怯(殊不知这就是解决方法),Learn English是一场持久战,越挫越勇!!!