2013-12-10 12 views
8

Ho una tabella in MYSQL e sto usando i modelli JDBC per fare un inserto in quella tabella.Perché i modelli JDBC di Spring non utilizzano il valore predefinito delle tabelle

Una delle colonne ha un valore predefinito e non lo specifica nella mappa Map<String, Object> parameters.

Ricevo un'eccezione Column 'colName' cannot be null.

Qualcuno può spiegare questo per favore?

Grazie

* Edit: codice *

contactDetailsInsertTemplate = new SimpleJdbcInsert(dataSource).withTableName("contactdetails").usingGeneratedKeyColumns("contactcode"); 
Map<String, Object> parameters = new HashMap<String, Object>(); 
Number newId = contactDetailsInsertTemplate.executeAndReturnKey(parameters); 
+0

Si prega di mostrare il codice che si sta utilizzando. –

risposta

11

È necessario limitare le colonne specificate nell'Inserto SQL.

Vedi SimpleJdbcInsert.usingColumns()

Se non si esegue questa operazione, l'istruzione SQL avrà bisogno di valori per tutte le colonne ei valori predefiniti non possono essere utilizzati.

ad es. utilizzare

insert into mytable (col1, col2) values (val1, val2); 

invece di

insert into mytable values (val1, val2); 
1

INSERT INTO mytable (1,null) non è lo stesso di INSERT INTO mytable (1). Il precedente inserisce specificatamente null, la successiva lascia la decisione al DB (che sarebbe il valore predefinito). Spring JDBC sta facendo il primo.

+0

Grazie per la risposta. Entrambe le tue risposte sono corrette ma la risposta di NickJ è più accurata per la domanda specifica. Vorrei poter accettare entrambi, ma lo accetterò e ti sovverterò :). – Gleeb

1

Il problema è da qualche altra parte: quando uso SimpleJdbcInsert e passare una mappa di parametri ad essa, mi aspetto che semplice per creare inserto statment solo con i parametri che ho fornito. Ho una colonna NOT NULL nella tabella con il valore DEFAULT e non voglio specificarlo. Inoltre, non voglio mettere esplicitamente tutti i nomi delle colonne in usingColumns() come ho appena fatto durante la creazione di una mappa di parametri! Perché dovrei farlo di nuovo? Il problema è che SimpleJdbcInsert vuole essere più intelligente e aggiungere tutte le colonne per inserire istruzioni che non sono necessarie. Perché non creare un'istruzione solo usando le colonne fornite con la mappa dei parametri?

Vedi: http://forum.spring.io/forum/spring-projects/data/54209-simplejdbcinsert-and-columns-with-default-values

0

È possibile aggiungere le colonne che hanno un valore di default come parametri usingGeneratedKeyColumns().
I nomi di colonna inclusi come parametri di tale metodo verranno omessi dall'istruzione INSERT generata.

Problemi correlati