2010-03-10 187 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