2014-02-28 72 views
4

我有救DB中的用户的方法和返回自动生成的ID:如何在KeyHolder中正确使用JdbcTemplate.update?

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 
+0

这是否帮助? http://stackoverflow.com/a/15436696/1325237 – Alex

回答

2

看起来像你使用的是Spring。根据版本的不同,JdbcTemplate接口会有所不同。不过,在没有版本我所知道的是有一个匹配什么,我认为你的预期调用的方法签名:

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

由于弹簧3的,这里只有:

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数组必须作为单独的参数拆分。基本上,这种方法不适用于你正在做的事情。

如果你想使用密钥持有者,我想你需要改变你的方法使用此方法:

update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder) 
+0

是的。谢谢。 – user3279337