5

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にプッシュするために使用されたのと同じ接続ではありません。

何か案が?

たくさんのご協力ありがとうございました!

オクターブ

4

2 に答える 2

9

はい、実際にDBUnitFAQで解決策を見つけました

IDENTITYまたは自動インクリメント列でDbUnitを使用できますか?

多くのRDBMSでは、IDENTITY列と自動インクリメント列をクライアント値で暗黙的に上書きできます。DbUnitは、これらのRDBMSでネイティブに使用できます。MS SQL ServerやSybaseなどの一部のデータベースでは、クライアント値の書き込みを明示的にアクティブ化する必要があります。この機能をアクティブにする方法はベンダー固有です。DbUnitは、InsertIdentityOperationクラスを使用してMSSQLServerにこの機能を提供します。

MS SQL Server用に作成されていますが、Sybaseでも機能します。だから私は私のデータセットをdbにプッシュします

    new InsertIndentityOperation(DatabaseOperation.CLEAN_INSERT).execute(connection,initialDataSet); 

Etvoilà。

あなたの答えrawheiserをありがとう。

于 2010-11-18T08:33:42.060 に答える
1

詳細については、DBUnitに精通していません。しかし、同様の状況で、テーブルの切り捨てとID値の再シードを使用しました。

dbcc checkident 
于 2010-11-17T20:42:14.783 に答える