DBUnitの:名前が完全に一致しないため、「MYDB」カタログに<にschema.table>「MYSCHEMA .MYTABLE」の列「MYCOL」が見つかりませんでした
質問
私はorg.dbunit.database.QueryDataSetを使用して、私のデータベースのエクスポートを作成する問題を抱えています。私はorg.dbunit.dataset.xml.FlatXmlDataSet.write(IDataSet、OutputStreamを)呼び出すと、私は次のスタックトレースを取得します:
java.lang.IllegalStateException: Did not find column 'MYCOL' for <schema.table> 'MYSCHEMA .MYTABLE' in catalog 'MYDB' because names do not exactly match.
at org.dbunit.database.ResultSetTableMetaData.scrollTo(ResultSetTableMetaData.java:297)
at org.dbunit.database.ResultSetTableMetaData.createColumnFromDbMetaData(ResultSetTableMetaData.java:262)
at org.dbunit.database.ResultSetTableMetaData.createMetaData(ResultSetTableMetaData.java:154)
at org.dbunit.database.ResultSetTableMetaData.createMetaData(ResultSetTableMetaData.java:131)
at org.dbunit.database.ResultSetTableMetaData.<init>(ResultSetTableMetaData.java:97)
at org.dbunit.database.AbstractResultSetTable.<init>(AbstractResultSetTable.java:84)
at org.dbunit.database.AbstractResultSetTable.<init>(AbstractResultSetTable.java:63)
at org.dbunit.database.ForwardOnlyResultSetTable.<init>(ForwardOnlyResultSetTable.java:65)
at org.dbunit.database.CachedResultSetTableFactory.createTable(CachedResultSetTableFactory.java:52)
at org.dbunit.database.AbstractDatabaseConnection.createQueryTable(AbstractDatabaseConnection.java:90)
at org.dbunit.database.AbstractDatabaseConnection.createTable(AbstractDatabaseConnection.java:115)
at org.dbunit.database.QueryTableIterator.getTable(QueryTableIterator.java:143)
at org.dbunit.dataset.stream.DataSetProducerAdapter.produce(DataSetProducerAdapter.java:83)
at org.dbunit.dataset.xml.FlatXmlWriter.write(FlatXmlWriter.java:124)
at org.dbunit.dataset.xml.FlatXmlDataSet.write(FlatXmlDataSet.java:341)
この研究では、私は他の誰かが戻って月にこの問題を持っていた、と2.4.4のスナップショットビルドを使用して、それを修正したことを見ました。私は2.4.4の定期的なリリースビルドを使用しています。
任意のアイデア?
解決
これは、DB2ドライバのバグのようです。
あなたのログを見れば、は、スキーマ名に予備のスペースを持っています。このスキーマ名は、DB2ドライバによって返されます。 DbUnitを最後のソースにこの特定のエラー(バグ2838922)のために実装されます。
のように修正 バグ2838922で述べたように、、これは完全に問題を解決しない場合があります。
このような場合は、、残りの問題を回避するには、例として、デフォルト1を取り、次のように「マッチ」の方法を変更することで、独自のIMetadataHandlerを実装することです。
...
boolean areEqual =
areEqualIgnoreBothNull(catalog, catalogName, caseSensitive) &&
areEqualIgnoreNull(schema, schemaName, caseSensitive) &&
areEqualIgnoreNull(table, tableName, caseSensitive) &&
areEqualIgnoreNull(column, columnName, caseSensitive);
return areEqual;
private boolean areEqualIgnoreBothNull(String value1, String value2,
boolean caseSensitive) {
boolean areEqual = true;
if (value1 != null && value2 != null) {
if (value1.equals("") && value2.equals("")) {
if (caseSensitive) {
areEqual = value1.equals(value2);
} else {
areEqual = value1.equalsIgnoreCase(value2);
}
}
}
return areEqual;
}
(あなたも平等テストの前にスキーマ名をtrimingすることにより、独自のIMetadataHandlerの最初のスキーマ名の問題を解決することができます)。
のページ http://dbunit.sourceforge.net/properties.html の方法を示していますIMetadataHandlerの実装を交換します。
他のヒント
この問題は、DB2を使用しただけで、その後に発生するようですし、 DBUnitの2.4.7で固定されています。 のます。
あなたがしなければならないすべては、次のとおりです。
IDatabaseConnection connection = ...
connection.getConfig().setProperty
(
"http://www.dbunit.org/properties/metadataHandler",
new Db2MetadataHandler()
);