2010-03-10 9 views
7

Tôi đang sử dụng phiên bản mới nhất của DBUnit (2.4.7), trên Oracle 11GR2. Tôi đang sử dụng Java 6 (1.6.0_15) và phiên bản mới nhất của jar ứng dụng khách của Oracle (jdbc6.jar)DBunit tạo java.lang.ClassCastException: java.lang.String không thể chuyển sang oracle.sql.CLOB khi cố gắng tải trường CLOB

Tôi đã không thể tải thành công bất kỳ dữ liệu nào được tham chiếu bởi một trường CLOB Oracle từ một tệp XML vào cơ sở dữ liệu.

Tôi đã sử dụng tất cả các loại kết hợp của phiên bản của:

  • Oracle JDBC thư viện ojdbc5.jar, ojdbc6.jar, oracle 10 lọ
  • thư viện Hibernate vv ... Tôi nghĩ rằng vấn đề nằm trong DBUnit. Xem dưới đây để theo dõi ngăn xếp.

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

Tôi đang chạy Java 6, 1.6.0_15.

Tôi đã thử:

1) FlatXmlDataSet sử dụng định nghĩa này

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

2) XmlDataSet sử dụng định nghĩa này

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

Bất kỳ trợ giúp sẽ được nhiều đánh giá cao!

Stack trace sau:

 
     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 

Trả lời

2

này trông giống như Bug ID 1984596 và tôi không thực sự hiểu được trạng thái (nó được đóng lại nhưng ... Tôi không nhận được nếu vấn đề đã được cố định). Bạn có thể thử với DbUnit 2.2.1 như được đề xuất trong vấn đề (có vẻ như một thay đổi được giới thiệu trong phiên bản 2.2.2 đang gây ra sự cố). Nếu điều này hoạt động, bạn chắc chắn nên mở lại vấn đề.

+0

Wow, cảm ơn vì gợi ý, nó thực sự hiệu quả. Tôi thực sự thấy trang đó trong chuyến du lịch của tôi nhưng loại từ chối do tuổi tác và phiên bản DBunit được tham chiếu. Chỉ cần thông tin, tôi cần phải hoàn nguyên org.dbunit.ext.oracle.Oracle10DataTypeFactory về một org.dbunit.ext.oracle.OracleDataTypeFactory (và thực hiện các thay đổi khác) nhưng giờ Clobs tải thành công trong 11G.Tôi vẫn không thể tin rằng tôi là người duy nhất có hit này (CLOB tải trong Oracle 11G) Tôi sẽ cập nhật BUG ID được liệt kê ở trên ngay khi id SourceForge của tôi đến trong thư. Một lần nữa, một lời cảm ơn thực sự lớn! – Paul

+0

được cập nhật, cho phép xem những gì xuất hiện của nó ... dường như không hoạt động nhiều trên DBUnit những ngày này không may – Paul

+0

@Paul Cảm ơn bạn rất nhiều (vì phản hồi và nỗ lực). Và có, điều này rất đáng tiếc (tôi thích DbUnit rất nhiều cá nhân). –

2

Tôi cũng gặp sự cố này vào ngày khác sử dụng Ant và DBUnit. Tôi đang sử dụng Ant phiên bản 1.7.1, DBUnit 2.4.5., Với Oracle 10g. 'Làm việc xung quanh' tôi tìm thấy là chỉ định phương ngữ cơ sở dữ liệu trong Ant Task:

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

Khi tôi thêm thuộc tính dbconfig, vấn đề cast String/CLOB đã biến mất. Hy vọng điều này sẽ giúp bất cứ ai đã nhìn thấy lỗi này với Ant.

+0

Tôi có thể xác minh rằng thiết lập datatypeFactory hoạt động. Chúng tôi đang sử dụng 2.4.8 và đã có cùng một vấn đề, nhưng xác định Oracle10DatatypeFactory đã làm các trick. Tuy nhiên, chúng tôi đã lập trình nó như trong ví dụ sau: 'IDatabaseConnection conn = new DatabaseConnection (pConnection); DatabaseConfig config = conn.getConfig(); config.setProperty (DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new org.dbunit.ext.oracle.Oracle10DataTypeFactory()); \t \t ' – Brummo

3

Sử dụng org.dbunit.ext.oracle.Oracle10DataTypeFactory

trong cấu hình datafactory.

+0

Đó là câu trả lời đúng nhưng tôi gặp sự cố với cột NCLOB. Đó là do dbunit vẫn thiếu trường hợp 'nclob' trong Oracle10DataTypeFactory. Sau khi thêm thủ công trường hợp 'nclob' vào 'createDataType()' (tương tự như 'clob' one) phương pháp, các cột NCLOB cũng bắt đầu hoạt động chính xác. Dường như dbunit đang biến mất, rất đáng thất vọng. –