2010-03-10 14 views
7

Sto utilizzando l'ultima versione di DBUnit (2.4.7), su Oracle 11GR2. Sto usando Java 6 (1.6.0_15) e l'ultima versione del jar client di Oracle (jdbc6.jar)DBunit genera java.lang.ClassCastException: java.lang.String non può essere lanciato su oracle.sql.CLOB quando si tenta di caricare un campo CLOB

Non riesco a caricare correttamente tutti i dati a cui fa riferimento un campo Oracle CLOB da un file XML nel Banca dati.

Ho usato tutti i tipi di combinazioni di versioni del:

  • JDBC Oracle biblioteca ojdbc5.jar, ojdbc6.jar, Oracle 10 vasetti
  • Hibernate biblioteca ecc ... Penso che la il problema si trova in DBUnit. Vedi sotto per la traccia dello stack.

    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>3.5.0-CR-2</version> 
    

    e

    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>3.4.0.GA</version> 
    

Io corro Java 6, 1.6.0_15.

ho provato:

1) FlatXmlDataSet usando questa definizione

<MESSAGE msg_id="1" mtp_id="1" msg_detail="asadds" /> 

2) XmlDataSet usando questa definizione

<table name="MESSAGE"> 
    <column>MSG_ID</column> 
    <column>MTP_ID</column> 
    <column>MSG_DETAIL</column> 
    <row> 
     <value>1</value> 
     <value>1</value> 
     <value>dsad</value> 
    </row> 
</table> 

Qualsiasi aiuto sarebbe molto apprezzato!

traccia Stack segue:

 
     at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:980) 
ERROR [10032010 14:15:13,031] - exception creating EntityManager: [] (MessageDAOTest.java:97) 
java.lang.RuntimeException: Exception in JpaDBTestCase 
     at com.ert.commons.junit4.hibernate.JpaDBTestCase.loadDbunitFiles(JpaDBTestCase.java:97) 
     at com.ert.ertmon.dao.ejb.impl.MessageDAOTest.setUpBeforeClass(MessageDAOTest.java:94) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27) 
     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
     at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62) 
     at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) 
     at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) 
     at org.apache.maven.surefire.Surefire.run(Surefire.java:177) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:334) 
     at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:980) 
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to oracle.sql.CLOB 
     at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:7898) 
     at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:7511) 
     at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:7984) 
     at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:237) 
     at org.dbunit.dataset.datatype.ClobDataType.setSqlValue(ClobDataType.java:71) 
     at org.dbunit.database.statement.SimplePreparedStatement.addValue(SimplePreparedStatement.java:73) 
     at org.dbunit.database.statement.AutomaticPreparedBatchStatement.addValue(AutomaticPreparedBatchStatement.java:63) 
     at org.dbunit.operation.AbstractBatchOperation.execute(AbstractBatchOperation.java:186) 
     at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190) 
     at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103) 
     at com.ert.commons.junit4.hibernate.JpaDBTestCase.loadDbunitFile(JpaDBTestCase.java:136) 
     at com.ert.commons.junit4.hibernate.JpaDBTestCase.loadDbunitFiles(JpaDBTestCase.java:92) 
     ... 21 more 

risposta

2

Questo appare come Bug ID 1984596 e io non capisco lo stato (è chiuso, ma ... Non capisco se il problema è stato risolto). Puoi provare con DbUnit 2.2.1 come suggerito nel problema (sembra che una modifica introdotta nella versione 2.2.2 stia causando il problema). Se funziona, dovresti riaprire definitivamente il problema.

+0

Wow, grazie per il suggerimento, ha funzionato davvero. Ho effettivamente visto quella pagina nei miei viaggi ma in genere l'ho rifiutata a causa della sua età e della versione di DBunit referenziata. Giusto FYI, avevo bisogno di ripristinare org.dbunit.ext.oracle.Oracle10DataTypeFactory su org.dbunit.ext.oracle.OracleDataTypeFactory (e apportare altre modifiche) ma ora i Clob caricano con successo in 11G.Non riesco ancora a credere di essere l'unico a esserne colpito (caricamento di CLOB in Oracle 11G) aggiornerò l'ID di BUG sopra elencato non appena il mio ID SourceForge arriverà per posta. Ancora una volta, un grande grazie! – Paul

+0

aggiornato, vediamo cosa ne deriva ... non sembra esserci molta attività su DBUnit in questi giorni purtroppo – Paul

+0

@Paul Grazie mille (per il feedback e lo sforzo). E sì, questo molto sfortunato (mi piace DbUnit molto personalmente). –

2

Ho riscontrato questo problema anche l'altro giorno utilizzando Ant e DBUnit. Sto usando Ant versione 1.7.1, DBUnit 2.4.5., Con Oracle 10g. Il 'lavoro intorno' ho trovato è stato per specificare il dialetto database nel Ant Task:

<dbunit driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:[email protected]:1521:MyOracleDb" userid="[userid]" password="[password]" schema="[MySchema]"> 
    <dbconfig> 
     <property name="datatypeFactory" value="org.dbunit.ext.oracle.OracleDataTypeFactory"/> 
    </dbconfig> 
    <operation type="CLEAN_INSERT" src="MY_DATA.xml" /> 
</dbunit> 

Una volta ho aggiunto la proprietà dbconfig, la questione fusione String/CLOB non c'era più. Spero che questo aiuti chiunque abbia visto questo errore con Ant.

+0

Posso verificare che l'impostazione di datatypeFactory funzioni. Stiamo usando 2.4.8 e abbiamo avuto lo stesso problema, ma specificare Oracle10DatatypeFactory ha fatto il trucco. Tuttavia, l'abbiamo fatto a livello di programmazione, come nell'esempio seguente: 'IDatabaseConnection conn = new DatabaseConnection (pConnection); DatabaseConfig config = conn.getConfig(); config.setProperty (DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new org.dbunit.ext.oracle.Oracle10DataTypeFactory()); \t \t ' – Brummo

3

Usa org.dbunit.ext.oracle.Oracle10DataTypeFactory

in config DataFactory.

+0

Questa è la risposta corretta ma ho riscontrato il problema con la colonna NCLOB. Questo perché a dbunit manca ancora il caso 'nclob' in Oracle10DataTypeFactory. Dopo aver aggiunto manualmente il caso 'nclob' in 'createDataType()' (analogamente a 'clob' uno) il metodo ha iniziato a funzionare correttamente anche con le colonne NCLOB. Sembra che l'unità digitale stia svanendo, molto deludente. –

Problemi correlati