ID列を持つテーブルをDBユニットでロードしようとしています。id値を自分で設定できるようにしたい(データベースで生成されたくない)。
これが私のテーブルの最小限の定義です
create table X (
id numeric(10,0) IDENTITY PRIMARY KEY NOT NULL
)
Xに行を挿入するには、次のSQLを実行します
set INDENTITY_INSERT X ON
insert into X(id) VALUES(666)
問題ない。しかし、次のdbユニットXMLデータセット(RS_7_10_minimal_ini.xml)を使用してこのテーブルをロードしようとすると
<dataset>
<X id="666"/>
</dataset>
次の最小限のJUnit(DBTestCase)テストケースを使用します。
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() {
// ...
}
}
次の例外で失敗します
com.sybase.jdbc3.jdbc.SybSQLException: Explicit value specified for identity field in table 'X' when 'SET IDENTITY_INSERT' is OFF.
ID列の値が指定されている行を挿入する前に、DBユニットがIDをオンにしないようです。
JdbcDataBaseTesterから取得した接続で自分自身を実行しようとしましたが、うまくいきませんでした。おそらく、新しい接続か、データをdeDBにプッシュするために使用されたのと同じ接続ではありません。
何か案が?
たくさんのご協力ありがとうございました!
オクターブ