Вот полный пример (проверено на PostgreSQL 8.4):
Моя таблица:
CREATE TABLE test
(
id serial NOT NULL,
otherid serial NOT NULL,
val text,
CONSTRAINT test_pkey PRIMARY KEY (id, otherid)
)
Вот как вы получаете ключи обратно:
public void doStuff() {
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement("insert into test(val) values (?)", Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, 42);
return ps;
}
},
keyHolder);
keyHolder.getKeys().get("id");
keyHolder.getKeys().get("otherid");
}
Теперь, если вы хотите получить составной ключ как экземпляр некоторого класса непосредственно из keyHolder, это не просто.
JdbcTemplate использует ColumnMapRowMapper для сопоставления сгенерированных ключей (сгенерированные ключи возвращаются как набор результатов, по крайней мере, приPostgreSQL. Он на самом деле возвращает всю строку, как если бы вы выполняли select для только что вставленной строки).Тот же ColumnMapRowMapper используется во многих других местах JdbcTemplate.
Единственная возможная точка расширения здесь - это сам KeyHolder.Вот что вы можете сделать:
public void doStuff() {
CompositeKeyHolder keyHolder = new CompositeKeyHolder();
... same code here ...
keyHolder.getCompositeKey();
}
class CompositeKeyHolder extends GeneratedKeyHolder {
private boolean converted;
public CompositeKey getCompositeKey() {
return new CompositeKey((Integer)this.getKeys().get("id"), (Integer)this.getKeys().get("otherid"));
}
}
class CompositeKey {
private Integer id;
private Integer otherId;
CompositeKey(Integer id, Integer otherId) {
this.id = id;
this.otherId = otherId;
}
public Integer getId() {
return id;
}
public Integer getOtherId() {
return otherId;
}
}