我在Oracle 11GR2上使用最新版本的DBUnit(2.4.7)。我正在使用Java 6(1.6.0_15)和最新版本的Oracle客户端jar(jdbc6.jar)
我无法将XML文件中CLOB Oracle字段引用的任何数据成功加载到数据库中。
我使用了各种版本的组合:
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
答案 0 :(得分:3)
使用 org.dbunit.ext.oracle.Oracle10DataTypeFactory
在datafactory配置中。
答案 1 :(得分:2)
这看起来像Bug ID 1984596而且我并不真正了解状态(它已经关闭但是......如果问题已得到解决,我不会理解)。您是否可以按照问题中的建议尝试使用DbUnit 2.2.1(似乎2.2.2版本中引入的更改导致了问题)。如果这样做,你肯定应该重新打开这个问题。
答案 2 :(得分:2)
前几天我也遇到过这个问题,使用Ant和DBUnit。我使用的是Ant版本1.7.1,DBUnit 2.4.5,以及Oracle 10g。我找到的“解决方法”是在Ant任务中指定数据库方言:
<dbunit driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin@127.0.0.1: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>
一旦我添加了dbconfig属性,String / CLOB强制转换问题就消失了。希望这可以帮助任何已经在Ant中看到此错误的人。