Si le framework n'est pas informé de la colonne qui est la clé, il renverra toutes les colonnes de la table en tant que clés.
Vous pouvez l'informer en passant un nouveau paramètre à la méthode de mise à jour, comme suit :
template.update(query, data, keyHolder, new String[] { "id" });
Voir NamedParameterJdbcTemplate. mise à jour(sql, paramSource, generatorKeyHolder, keyColumnNames)