DBunit создает java.lang.ClassCastException: java.lang.String не может быть приведен к oracle.sql.CLOB при попытке загрузить поле CLOB - PullRequest
7 голосов
/ 10 марта 2010

Я использую последнюю версию DBUnit (2.4.7) в Oracle 11GR2. Я использую Java 6 (1.6.0_15) и последнюю версию клиентского jar Oracle (jdbc6.jar)

Мне не удалось успешно загрузить в базу данных любые данные, на которые ссылается поле Oracle CLOB, из файла 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>

Любая помощь будет высоко ценится!

След стека следует:

        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

Ответы [ 3 ]

3 голосов
/ 02 сентября 2012

Использование org.dbunit.ext.oracle.Oracle10DataTypeFactory

в конфигурации данных.

2 голосов
/ 29 октября 2010

Я также столкнулся с этой проблемой на днях, используя 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.

2 голосов
/ 11 марта 2010

Это выглядит как Идентификатор ошибки 1984596 , и я не совсем понимаю статус (он закрыт, но ... я не получаю, если проблема была исправлена). Не могли бы вы попробовать с DbUnit 2.2.1, как предложено в проблеме (кажется, что изменение, внесенное в версию 2.2.2, вызывает проблему). Если это сработает, вам обязательно нужно снова открыть проблему.

...