DBUnit: Não encontrou a coluna 'MyCol' para 'meu_esquema .MYTABLE' no catálogo MYDB 'porque os nomes não correspondem exactamente
Pergunta
Estou tendo problemas para criar uma exportação de meu banco de dados usando um org.dbunit.database.QueryDataSet. Quando eu chamar org.dbunit.dataset.xml.FlatXmlDataSet.write (IDataSet, OutputStream), recebo a seguinte rastreamento de pilha:
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)
Em investigar este, eu vi que alguém tinha este problema em fevereiro, e fixa-lo usando uma compilação instantâneo de 2.4.4. Eu estou usando a compilação de lançamento regular de 2.4.4.
Todas as idéias?
Solução
Este parece ser um bug no driver DB2.
Se você olhar para o seu log, você tem um espaço de reposição no nome do esquema. Este nome do esquema é retornado pelo driver DB2. Uma correção como foi implementado para este erro específico na última fonte de dbunit (bug 2.838.922).
Como mencionado no bug 2838922, isso pode não resolver o problema completamente.
Se este for o caso, uma solução alternativa para o problema restante é para implementar sua própria IMetadataHandler tomando a um padrão como um exemplo e mudar o método de "partidas", como segue:
...
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;
}
(você também pode resolver o primeiro problema nome do esquema em seu próprio IMetadataHandler por triming o nome do esquema antes do teste de igualdade)
A página http://dbunit.sourceforge.net/properties.html mostra como para substituir a implementação de IMetadataHandler.
Outras dicas
Esse problema parece ocorrer somente em seguida, usando DB2 e é fixo com DBUnit 2.4.7 .
Tudo que você tem a fazer é:
IDatabaseConnection connection = ...
connection.getConfig().setProperty
(
"http://www.dbunit.org/properties/metadataHandler",
new Db2MetadataHandler()
);