DBUnit: Non hai trovato la colonna 'mycol' per 'myschema .MYTABLE' in catalogo 'MYDB' perché i nomi non corrisponde esattamente

StackOverflow https://stackoverflow.com/questions/1060027

  •  21-08-2019
  •  | 
  •  

Domanda

Sto avendo difficoltà a creare un'esportazione del mio database utilizzando un org.dbunit.database.QueryDataSet. Quando chiamo org.dbunit.dataset.xml.FlatXmlDataSet.write (IDataSet, OutputStream), ottengo il seguente analisi dello stack:

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)

Nella ricerca di questo, ho visto che qualcun altro ha avuto questo problema alla schiena nel mese di febbraio, e fissato utilizzando una build un'istantanea di 2.4.4. Sto usando la build di rilascio regolare 2.4.4.

Tutte le idee?

È stato utile?

Soluzione

Questo sembra essere un bug nel driver DB2.

Se si guarda il registro, si dispone di uno spazio di ricambio nel nome dello schema. Questo nome dello schema viene restituito dal driver DB2. Una correzione come stato implementato per questo errore specifico in ultima fonte di DBUnit (bug 2.838.922).

Come accennato nel bug 2838922, questo potrebbe non risolvere il problema completamente.

Se questo è il caso, una soluzione per il problema che rimane è quello di implementare il proprio IMetadataHandler prendendo quella di default come esempio e cambiando il metodo di "partite" come 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;
        }

(si può anche risolvere il primo numero nome dello schema nel proprio IMetadataHandler dal triming il nome dello schema prima del test di uguaglianza)

La pagina http://dbunit.sourceforge.net/properties.html mostra come per sostituire un l'attuazione di IMetadataHandler.

Altri suggerimenti

Questo problema sembra verificarsi solo quindi utilizzando DB2 ed è href="http://sourceforge.net/p/dbunit/bugs/258/#0156" fissati con DBUnit 2.4.7 .

Tutto quello che dovete fare è:

IDatabaseConnection connection = ...

connection.getConfig().setProperty
(
    "http://www.dbunit.org/properties/metadataHandler",
    new Db2MetadataHandler()
);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top