8

我在 Oracle 11GR2 上使用最新版本的 DBUnit (2.4.7)。我正在使用 Java 6 (1.6.0_15) 和最新版本的 Oracle 客户端 jar (jdbc6.jar)

我无法成功地将 CLOB Oracle 字段引用的任何数据从 XML 文件加载到数据库中。

我使用了各种版本的组合:

  • Oracle JDBC 库 ojdbc5.jar、ojdbc6.jar、oracle 10 jars
  • 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>

任何帮助将非常感激!

堆栈跟踪如下:

        在 org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:980)
错误 [10032010 14:15:13,031] - 创建 EntityManager 的异常:[] (MessageDAOTest.java:97)
java.lang.RuntimeException:JpaDBTestCase 中的异常
        在 com.ert.commons.junit4.hibernate.JpaDBTestCase.loadDbunitFiles(JpaDBTestCase.java:97)
        在 com.ert.ertmon.dao.ejb.impl.MessageDAOTest.setUpBeforeClass(MessageDAOTest.java:94)
        在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        在 java.lang.reflect.Method.invoke(Method.java:597)
        在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
        在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
        在 org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
        在 org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
        在 org.junit.runners.ParentRunner.run(ParentRunner.java:236)
        在 org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
        在 org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
        在 org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
        在 org.apache.maven.surefire.Surefire.run(Surefire.java:177)
        在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        在 java.lang.reflect.Method.invoke(Method.java:597)
        在 org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:334)
        在 org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:980)
原因:java.lang.ClassCastException:java.lang.String 无法转换为 oracle.sql.CLOB
        在 oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:7898)
        在 oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:7511)
        在 oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:7984)
        在 oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:237)
        在 org.dbunit.dataset.datatype.ClobDataType.setSqlValue(ClobDataType.java:71)
        在 org.dbunit.database.statement.SimplePreparedStatement.addValue(SimplePreparedStatement.java:73)
        在 org.dbunit.database.statement.AutomaticPreparedBatchStatement.addValue(AutomaticPreparedBatchStatement.java:63)
        在 org.dbunit.operation.AbstractBatchOperation.execute(AbstractBatchOperation.java:186)
        在 org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
        在 org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
        在 com.ert.commons.junit4.hibernate.JpaDBTestCase.loadDbunitFile(JpaDBTestCase.java:136)
        在 com.ert.commons.junit4.hibernate.JpaDBTestCase.loadDbunitFiles(JpaDBTestCase.java:92)
        ... 21 更多
4

3 回答 3

4

使用 org.dbunit.ext.oracle.Oracle10DataTypeFactory

在数据工厂配置中。

于 2012-09-02T08:59:19.750 回答
3

这看起来像错误 ID 1984596,我不太了解状态(它已关闭,但是......如果问题已得到解决,我不知道)。您能否按照问题中的建议尝试使用 DbUnit 2.2.1(似乎是版本 2.2.2 中引入的更改导致了问题)。如果这有效,您绝对应该重新打开该问题。

于 2010-03-10T22:49:33.380 回答
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 cast 问题就消失了。希望这可以帮助任何在 Ant 中看到此错误的人。

于 2010-10-29T12:51:38.317 回答