Provo a caricare una tabella, che ha una colonna Identity, con DB Unit. Voglio essere in grado di impostare il valore id da solo (non voglio che il database lo generi per me).Attivazione di IDENTITY_INSERT su una tabella per caricarlo con DB Unità
Ecco una definizione minima del mio tavolo
create table X (
id numeric(10,0) IDENTITY PRIMARY KEY NOT NULL
)
Per inserire una riga in X, eseguo il seguente SQL
set INDENTITY_INSERT X ON
insert into X(id) VALUES(666)
Nessun problema. Ma quando provo a caricare questa tabella con il seguente db dataset unità XML (RS_7_10_minimal_ini.xml)
<dataset>
<X id="666"/>
</dataset>
utilizzando il seguente JUnit minima (DBTestCase) banco di prova:
package lms.lp.functionnal_config;
import java.io.FileInputStream;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import lms.DBUnitConfig;
import org.junit.Test;
public class SampleTest extends DBTestCase
{
public SampleTest(String name)
{
super(name);
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, DBUnitConfig.DBUNIT_DRIVER_CLASS);
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, DBUnitConfig.DBUNIT_CONNECTION_URL);
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, DBUnitConfig.DBUNIT_USERNAME);
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, DBUnitConfig.DBUNIT_PASSWORD);
}
protected IDataSet getDataSet() throws Exception
{
return new FlatXmlDataSetBuilder().build(new FileInputStream("src/test/resources/RS_7_10_minimal_ini.xml"));
}
@Test
public void testXXX() {
// ...
}
}
Si riesce con il seguente eccezione
com.sybase.jdbc3.jdbc.SybSQLException: Explicit value specified for identity field in table 'X' when 'SET IDENTITY_INSERT' is OFF.
sembra DB unità non si accende identità ON prima di inserire una riga per cui viene specificato il valore della colonna di identità.
Ho già provato ad eseguirmi sulla connessione recuperata dal JdbcDataBaseTester ma senza fortuna. Probabilmente una nuova connessione o non la stessa connessione utilizzata per inserire i dati in de DB.
Qualche idea?
Grazie mille per il vostro aiuto!
Octave
È un errore di battitura o il nome è cambiato in InsertIdentityOperation? Nel mio 'getSetUpOperation()' ho usato 'return new InsertIdentityOperation (DatabaseOperation.CLEAN_INSERT); ' – dustmachine
Sei un vero risparmiatore :) grazie mille ... –