2010-03-10 7 views
7

Ich verwende die neueste Version von DBUnit (2.4.7) auf Oracle 11GR2. Ich benutze Java 6 (1.6.0_15) und die neueste Version von Oracle's Client jar (jdbc6.jar)DBunit generiert java.lang.ClassCastException: java.lang.String kann nicht in oracle.sql.CLOB umgewandelt werden, wenn versucht wird, ein CLOB-Feld zu laden

Ich konnte nicht erfolgreich alle Daten von einem Oracle-CLOB-Feld aus einer XML-Datei in die geladen werden Datenbank.

  • Oracle JDBC-Bibliothek ojdbc5.jar, ojdbc6.jar, Orakel 10 Gläser
  • Hibernate Bibliothek etc ... Ich denke, die:

    Ich habe alle möglichen Kombinationen von Versionen der verwendeten Problem liegt in DBUnit. Siehe unten für Stack-Trace.

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

    und

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

Ich bin mit Java 6, 1.6.0_15.

Ich habe versucht:

1) FlatXmlDataSet mit dieser Definition

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

2) XMLDataSet mit dieser Definition

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

Jede Hilfe wäre sehr willkommen!

Stapel Spur folgt:

 
     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 

Antwort

2

Das sieht aus wie Bug ID 1984596 und ich nicht wirklich verstehen, den Status (es geschlossen ist, aber ... ich nicht, ob das Problem behoben wurde). Könnten Sie versuchen, mit DbUnit 2.2.1 wie in der Ausgabe vorgeschlagen (es scheint, dass eine Änderung in Version 2.2.2 eingeführt verursacht das Problem). Wenn dies funktioniert, sollten Sie das Problem auf jeden Fall erneut öffnen.

+0

Wow, danke für den Hinweis, es hat tatsächlich funktioniert. Ich habe diese Seite auf meinen Reisen gesehen, aber aufgrund ihres Alters und der verwiesenen DBunit-Version abgelehnt. Just FYI, ich musste die org.dbunit.ext.oracle.Oracle10DataTypeFactory zurück zu einer org.dbunit.ext.oracle.OracleDataTypeFactory (und andere Änderungen vornehmen), aber jetzt Clobs erfolgreich in 11G geladen.Ich kann immer noch nicht glauben, dass ich der Einzige bin, der darauf traf (CLOB loading in Oracle 11G) Ich werde die oben aufgeführte BUG ID aktualisieren, sobald meine SourceForge ID in der Mail erscheint. Nochmals, ein wirklich großer Dank! – Paul

+0

aktualisiert, mal sehen was da rauskommt ... scheint bei DBUnit in diesen Tagen leider nicht viel los zu sein – Paul

+0

@Paul Vielen Dank (für das Feedback und die Mühe). Und ja, das ist sehr bedauerlich (ich mag DbUnit sehr persönlich). –

2

Ich habe auch dieses Problem neulich mit Ant und DBUnit. Ich benutze Ant Version 1.7.1, DBUnit 2.4.5., Mit Oracle 10g. Die Arbeit rund um "Ich fand, war die Datenbank Dialekt in der Ant-Task angeben:

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

Sobald ich die dbconfig Eigenschaft hinzugefügt wurde die String/CLOB Guss Ausgabe gegangen. Hoffe, das hilft jedem, der diesen Fehler mit Ant gesehen hat.

+0

Ich kann überprüfen, dass das Festlegen der DatentypFactory funktioniert. Wir verwenden 2.4.8 und hatten das gleiche Problem, aber die Angabe der Oracle10DatatypeFactory hat den Trick gemacht. Wir haben es jedoch programmatisch gemacht, wie im folgenden Beispiel: 'IDatabaseConnection conn = new DatabaseConnection (pConnection); DatabaseConfig config = conn.getConfig(); config.setProperty (DatabaseConfig.PROPERTY_DATATYPE_FACTORY, neu org.dbunit.ext.oracle.Oracle10DataTypeFactory()); \t \t ' – Brummo

3

Verwenden org.dbunit.ext.oracle.Oracle10DataTypeFactory

in datafactory Konfig.

+0

Das ist die richtige Antwort, aber ich stieß auf das Problem mit NCLOB-Spalte. Das liegt daran, dass dbunit den Fall 'nclob' in Oracle10DataTypeFactory immer noch nicht enthält. Nach dem manuellen Hinzufügen von 'nclob' case zu 'createDataType()' (ähnlich wie bei 'clob'), haben NCLOB-Spalten ebenfalls korrekt funktioniert. Es scheint, dass dbunit verblasst, sehr enttäuschend. –

Verwandte Themen