ДБУнит:Не найден столбец «MYCOL» для <schema.table> «MYSCHEMA.MYTABLE» в каталоге «MYDB», поскольку имена не совсем совпадают.
Вопрос
У меня возникли проблемы с экспортом моей базы данных с помощью 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, это может не решить проблему полностью.
В этом случае обходным путем оставшейся проблемы является реализация собственного 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;
}
(вы также можете решить первую проблему с именем схемы в своем собственном 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()
);