如何在KeyHolder中正确使用JdbcTemplate.update?

时间:2014-02-28 17:40:19

标签: java spring spring-jdbc

我有一个方法可以将用户保存在DB中并返回自动生成的id:

public int save(User user) {
    KeyHolder holder = new GeneratedKeyHolder();
    jdbcTemplate.update(SAVE_USER, user.getParams(), holder);
    return holder.getKey().intValue();
}

public Object[] getParams() {
        return new Object[]{
                email, // String email
                password}; // String password
}

SAVE_USER = INSERT INTO user (email, password) VALUES (?, ?)

当我尝试执行某个方法时,我遇到了异常:

Request processing failed; nested exception is org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; 
SQL [INSERT INTO user (email, password) VALUES (?, ?)]; Invalid argument value: java.io.NotSerializableException; nested exception is java.sql.SQLException: Invalid argument value: java.io.NotSerializableException

1 个答案:

答案 0 :(得分:2)

看起来你正在使用Spring。根据版本的不同,JdbcTemplate接口会有所不同。不过,在我所知道的任何版本中都没有符合我认为您的预期呼叫的方法签名:

update(String sql, Object[] args, KeyHolder keyHolder)

从春季开始,只有:

update(PreparedStatementCreator psc) 
update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder) 
update(PreparedStatementCreator psc, PreparedStatementSetter pss) 
update(java.lang.String sql) 
update(java.lang.String sql, java.lang.Object[] args, int[] argTypes) 
update(String sql, PreparedStatementSetter pss) 

/* and this is the one I think you're matching */
update(java.lang.String sql, java.lang.Object... args)  

不幸的是,即使你的电话与最后一个方法的签名相匹配,它也不会做我认为你正在寻找的东西。它尝试将每个参数作为单个参数应用于SQL语句。在这种情况下,你的KeyHolder是不合适的,并且params数组必须作为单独的参数分割出来。基本上,这种方法对你正在做的事情不起作用。

如果您想使用KeyHolder,我认为您需要更改使用此方法的方法:

update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)