2010-03-10 20 views
7

Estoy utilizando la última versión de DBUnit (2.4.7), en Oracle 11GR2. Estoy usando Java 6 (1.6.0_15) y la última versión del contenedor de Oracle (jdbc6.jar)DBunit genera java.lang.ClassCastException: java.lang.String no se puede convertir a oracle.sql.CLOB al intentar cargar un campo CLOB

No he podido cargar correctamente los datos referenciados por un campo CLOB Oracle desde un archivo XML en el base de datos.

que he usado todo tipo de combinaciones de versiones del:

  • JDBC de Oracle biblioteca ojdbc5.jar, ojdbc6.jar, Oracle 10 frascos
  • biblioteca Hibernate, etc ... Creo que la problema radica en DBUnit. Vea a continuación el trazado de la pila.

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

    y

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

estoy corriendo Java 6, 1.6.0_15.

He intentado:

1) FlatXmlDataSet utilizando esta definición

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

2) XmlDataSet utilizando esta definición

<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> 

Cualquier ayuda sería muy apreciada!

Seguimiento de la pila siguiente:

 
     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 

Respuesta

2

Esto parece Bug ID 1984596 y no entienden realmente el estado (que está cerrada, pero ... No entiendo si el problema se ha solucionado). Podría intentar con DbUnit 2.2.1 como se sugiere en el problema (parece que un cambio introducido en la versión 2.2.2 está causando el problema). Si esto funciona, definitivamente debes volver a abrir el problema.

+0

Wow, gracias por la pista, realmente funcionó. De hecho, vi esa página en mis viajes pero la rechacé por su edad y la versión de DBunit a la que se hace referencia. Solo FYI, necesitaba revertir org.dbunit.ext.oracle.Oracle10DataTypeFactory a un org.dbunit.ext.oracle.OracleDataTypeFactory (y hacer otros cambios) pero ahora Clobs carga correctamente en 11G.Todavía no puedo creer que soy el único cuyo éxito sobre esto (CLOB cargando en Oracle 11G) Actualizaré la IDENTIFICACIÓN DE ERROR que figura arriba tan pronto como mi ID de SourceForge llegue por correo. De nuevo, ¡realmente un gran agradecimiento! – Paul

+0

actualizado, veamos qué sucede ... parece que no hay mucha actividad en DBUnit actualmente desafortunadamente – Paul

+0

@Paul Muchas gracias (por los comentarios y el esfuerzo). Y sí, esto es muy desafortunado (me gusta mucho DbUnit personalmente). –

2

También encontré este problema el otro día usando Ant y DBUnit. Estoy usando Ant versión 1.7.1, DBUnit 2.4.5., Con Oracle 10g. El 'trabajo en torno a' que encontré fue para especificar el dialecto base de datos en la Hormiga de tareas:

<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 vez añadí la propiedad dbconfig, el problema con un reparto de cuerdas/CLOB se había ido. Espero que esto ayude a cualquiera que haya visto este error con Ant.

+0

Puedo verificar que funcione la configuración de datatypeFactory. Estamos usando 2.4.8 y tuvimos el mismo problema, pero especificar Oracle10DatatypeFactory fue el truco. Sin embargo, lo hicimos mediante programación, como en el siguiente ejemplo: '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

Uso org.dbunit.ext.oracle.Oracle10DataTypeFactory

en config datafactory.

+0

Esa es la respuesta correcta, pero me encontré con el problema con la columna NCLOB. Esto se debe a que dbunit todavía no tiene el caso de 'nclob' en Oracle10DataTypeFactory. Después de agregar manualmente el caso 'nclob' en el método 'createDataType()' (de manera similar a 'clob' one), las columnas NCLOB también comenzaron a funcionar correctamente. Parece que dbunit se está desvaneciendo, muy decepcionante. –

Cuestiones relacionadas