2014-02-28 71 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