java - Can't insert into Sql Server using Spring Framework SimpleJdbcInsert -
i'm trying insert row in sql server 2008 using jdbc spring framework:
here code:
bdclass bdclass= new bdclass(bdclass.bdconfig.connectionstring_myhome); person personanueva = new person(); personanueva.setidperson(5); personanueva.setusuario("javauser"); personanueva.setclave("javapassword"); personanueva.setnombre("javanombreusuario"); personanueva.setactivo("s"); personanueva.addperson(bdclass); //person class public void addperson(bdclass bdclass) { map<string, object> parameters = new hashmap<string, object>(); parameters.put(constantes.idperson, this.getidperson()); parameters.put(constantes.usuario,this.getusuario()); parameters.put(constantes.clave,this.getclave()); parameters.put(constantes.nombre,this.getnombre()); parameters.put(constantes.activo, this.getactivo()); bdclass.insert(parameters,constantes.table_name); } //bdclass insert
in step enabling identity insert
public void insert(map<string, object> parameters, string tablename) { this.jdbctemplate.execute("set identity_insert " + tablename + " on"); jdbcinsert = new simplejdbcinsert(this.jdbctemplate).withtablename(tablename); jdbcinsert.execute(parameters); }
when running execute statement getting following exception:
caused by: com.microsoft.sqlserver.jdbc.sqlserverexception: cannot insert explicit value identity column in table 'persons' when identity_insert set off
i have tried command set identity_insert persons on in sql management studio no luck.
edit: idperson field identity, doesn't matter if pass parameter , value or not... i'm getting same error
edit 2:
ok, fixed using usingcolumns property, can specify every column:
public void insert(map<string, object> parameters, string tablename) { this.jdbctemplate.execute("set identity_insert " + tablename + " off"); jdbcinsert = new simplejdbcinsert(this.jdbctemplate).withtablename(tablename) .usingcolumns(person.constantes.usuario,person.constantes.clave, person.constantes.nombre,person.constantes.activo); jdbcinsert.execute(parameters); }
sql server's set identity
session scoped. means must execute command set identity_insert " + tablename + " on"
under same transaction using insert data.
spring jdbc template opens new connection each statement, , thats why not being able set under same session.
//connection opened --> statement executed --> connection closed this.jdbctemplate.execute("set identity_insert " + tablename + " on");
i think best approach not identity_insert on , following:
public void insert(map<string, object> parameters, string tablename) { jdbcinsert = new simplejdbcinsert(this.jdbctemplate).withtablename(tablename); //this column won't included on insert statement (it autogenerated sql server) jdbcinsert.setgeneratedkeyname("id"); jdbcinsert.execute(parameters); }
another alternative execute both statements under same transaction, don't think use simplejdbcinsert that.
Comments
Post a Comment