Mit Spring ' s KeyHolder-mit programmtechnisch erzeugten Primärschlüssel
Ich bin mit Spring NamedParameterJdbcTemplate zum ausführen einer insert in eine Tabelle. Die Tabelle verwendet eine NEXTVAL auf eine Sequenz zu erhalten, die die Primärschlüssel. Dann möchte ich diese generierte ID, die übergeben werden, zu mir zurück. Ich bin mit Spring ' s KeyHolder-Implementierung wie diese:
KeyHolder key = new GeneratedKeyHolder();
jdbcTemplate.update(Constants.INSERT_ORDER_STATEMENT, params, key);
Allerdings, wenn ich diese Anweisung ausführen, ich erhalte:
org.springframework.dao.DataRetrievalFailureException: The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number]
at org.springframework.jdbc.support.GeneratedKeyHolder.getKey(GeneratedKeyHolder.java:73)
Irgendwelche Ideen, was ich bin fehlt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, du bist mit der falschen Methode auf
JdbcTemplate
. Der einzige derupdate
Methoden, die scheinen zu passen Sie Ihre code-fragment istWenn ja, sind Sie vorbei
params
undkey
als zwei-element vargs array, undJdbcTemplate
ist die Behandlungkey
wie ein normaler bind-Parameter, und mis-interpretieren.Die einzige öffentliche
update
Methode aufJdbcTemplate
nimmtKeyHolder
istSie müssen sich also formulieren Sie Ihre code zu verwenden.
Nur gelöst ein ähnliches Problem - mit Oracle müssen Sie eine andere Methode verwenden (aus
NamedParameterJdbcOperations
) -mit keyColumnNames mit automatisch generierten Spalten, in meinem Fall einfach ["Id"]. Ansonsten erhalten Sie ROWID. Sehen Frühjahr doc für details.
Müssen Sie ausführen den
JdbcTemplate.update(PreparedStatementCreator p, KeyHolder k)
.Den Schlüssel aus der Datenbank zurückgegeben werden injiziert in die
KeyHolder
parameter-Objekt.Beispiel:
Mehr Informationen finden Sie hier in der Referenz-Dokumentation.
Nicht näher auf @konstantin Antwort: Hier ist ein voll funktionsfähiges Beispiel:
Vorausgesetzt, Datenbank ist Oracle-und Spaltennamen, die für die Speicherung erzeugte Id ist "GENERATED_ID" ( Kann ein beliebiger name sein).
HINWEIS: ich habe NamedParameterJdbcTemplate.update(....) In diesem Beispiel NICHT JdbcTemplate Klasse des Frühlings.
Mit MySQL