2010-03-10 192 views
7

我在Oracle 11GR2上使用最新版本的DBUnit(2.4.7)。我正在使用Java 6(1.6.0_15)和最新版本的Oracle客戶端jar(jdbc6.jar)DBunit生成java.lang.ClassCastException:在嘗試加載CLOB字段時,java.lang.String不能轉換爲oracle.sql.CLOB

我一直無法成功地將任何由CLOB Oracle字段引用的數據從XML文件加載到數據庫。

我使用過各種版本的組合:

  • 的Oracle JDBC庫ojdbc5.jar,ojdbc6.jar,甲骨文10瓶
  • Hibernate庫等等......我覺得問題在於DBUnit。請參閱下面的堆棧跟蹤。

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

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

我運行Java 6中,1.6.0_15。

我已經試過:

1)FlatXmlDataSet使用這個定義

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

2)XmlDataSet使用這個定義

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

任何幫助,將不勝感激!

堆棧跟蹤如下:

 
     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 

回答

2

這看起來像Bug ID 1984596,我真的不明白的狀態(它是封閉的,但......如果這個問題已經修復我不明白)。您可以嘗試使用DbUnit 2.2.1,正如問題中所建議的那樣(在版本2.2.2中引入的更改似乎會導致問題)。如果這有效,你應該重新開放這個問題。

+0

哇,感謝提示,它實際上工作。實際上,我在旅途中看到了該頁面,但由於其年齡和DBunit版本的引用而拒絕了該頁面。 只是FYI,我需要將org.dbunit.ext.oracle.Oracle10DataTypeFactory恢復爲org.dbunit.ext.oracle.OracleDataTypeFactory(並進行其他更改),但現在Clobs已成功加載到11G中。我仍然無法相信自己是唯一一個受此打擊的人(Oracle 11G中的CLOB加載) 只要我的SourceForge id進入郵件,我將更新上面列出的BUG ID。再次,非常感謝! – Paul 2010-03-11 01:56:12

+0

已更新,讓我們看看它是什麼...不幸的是,這些天似乎沒有太多的活動在DBUnit – Paul 2010-03-11 16:00:48

+0

@Paul非常感謝(反饋和努力)。是的,這非常不幸(我非常喜歡DbUnit)。 – 2010-03-11 16:13:34

2

我也在前些日子遇到過這個問題,使用Ant和DBUnit。我正在使用Ant版本1.7.1,DBUnit 2.4.5,和Oracle 10g。在「變通」我發現了指定在Ant任務數據庫方言:有一次,我添加了DBCONFIG財產

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

,串/ CLOB鑄的問題就消失了。希望這可以幫助任何已經看到這個錯誤與螞蟻。

+0

我可以驗證設置datatypeFactory是否有效。我們使用的是2.4.8,並且有同樣的問題,但是指定Oracle10DatatypeFactory的確有竅門。但是,我們通過編程來實現,如下例所示: 'IDatabaseConnection conn = new DatabaseConnection(pConnection); DatabaseConfig config = conn.getConfig(); config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,new org.dbunit.ext.oracle.Oracle10DataTypeFactory()); \t \t ' – Brummo 2011-11-25 13:27:54

3

使用 org.dbunit.ext.oracle.Oracle10DataTypeFactory

中的DataFactory配置。

+0

這是正確的答案,但我遇到了NCLOB專欄的問題。這是因爲dbunit仍然缺少Oracle10DataTypeFactory中的'nclob'情況。在手動將'nclob'大小寫添加到'createDataType()'(類似於'clob'之一)之後,方法NCLOB列也開始正常工作。看起來dbunit正在消失,非常令人失望。 – 2016-11-21 08:59:59